3 votes

Échec de la compilation Android avec artifactory - dépendances manquantes

Mon projet Android a des sous-modules qui sont dans git et artifactory. Les dépendances gradle du sous-module incluent ces éléments.

kapt 'com.google.dagger:dagger-compiler:2.15'
implementation 'com.google.maps.android:android-maps-utils:0.5'
implementation 'com.airbnb.android:lottie:2.5.3'

La saveur de construction de la version locale (lorsque le sous-module est tiré de git) se construit bien. Mais la version construction d'une télécommande (où le sous-module est tiré d'artifactory) échoue.

La saveur du déclenchement à distance est :

release {
    debuggable false
    minifyEnabled true
    useProguard true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.release
    multiDexKeepProguard file('multidex.pro')
}

L'erreur est que certains fichiers de bibliothèque ne peuvent pas être référencés.

ne trouve pas la superclasse ou l'interface dagger .internal.Factory Avertissement : _ProvideFakeTrackerFactory : ne peut trouver de superclasse ou d'interface interface dagger.internal.Factory Avertissement : Avertissement : _ProvidePropMapPresenterFactory : ne trouve pas de superclasse ou l'interface dagger.internal.Factory Avertissement : : ne peut pas trouver la classe référencée dagger.P rovides Avertissement : : ne peut pas trouver la dague de classe référencée .Module Avertissement : .FirebaseTracker : ne peut pas trouver la classe référencée com.google.firebase.analytics.FirebaseAnalytics Avertissement : .FirebaseTracker$subscribeToScreenEvents$1 : ne trouve pas la classe référencée classe référencée com.google.firebase.analytics.FirebaseAnalytics Avertissement : .. : Impossible de trouver la classe référencée com.airbnb.lottie.LottieAnimationView Avertissement : .DetailFragment_MembersInjector : Impossible de trouver la classe référencée class dagger.MembersInjector Avertissement : .map.DaggerPropMapComponent$Builder : ne trouve pas la classe référencée la classe référencée dagger.internal.Preconditions Avertissement : .MapFragment : ne trouve pas la classe référencée com.google.Android.gms.location.LocationServices Avertissement : .MapFragment : ne trouve pas la classe référencée com.google.Android.gms.location.FusedLocationProviderApi

Puisque ces fichiers de bibliothèque sont déjà dans les dépendances gradle du submodule, comment puis-je construire avec succès sans redéclarer ces bibliothèques dans le gradle de l'application ?

Gracias.

2voto

Sam Points 245

Vous parlez de Dépendances Transitives. C'est une erreur courante dans la compilation pour de nombreux ingénieurs.

Gardez à l'esprit que tous les pointeurs de référentiel déclarés dans les sous-modules enfants doivent AUSSI être déclarés dans l'application mère. Les URLs du référentiel ne sont pas incluses dans les modules parents. Donc si vous avez un dépôt maven personnalisé auquel vous accédez à partir d'un module enfant, vous devrez dupliquer cette URL dans l'application parent.

De même, si un module enfant a des dépendances, celles-ci sont connues sous le nom de dépendances transitives, ou "les dépendances de mes dépendances". Elles ne sont pas incluses dans le fichier APK ou AAR final compilé. Elles sont exclues par défaut. C'est le comportement normal par défaut.

Vous pouvez bien sûr créer un fichier FAT-JAR ou FAT-AAR pour inclure les dépendances transitives, mais c'est une mauvaise pratique et je ne la recommande pas.

Si vous générez des fichiers Maven appropriés, vous pouvez simplement ajouter la ligne pour :

monEspaceDeNomDeDépendanceenGradle{ transitif = true }

ce drapeau lui indique d'inclure les dépendances de ce dépendant. ATTENTION Cela ne fonctionne que si vous avez des fichiers structurés maven appropriés dans le repo maven enfant et hôte pour savoir quelles dépendances enfants inclure.

Maintenant, si vous avez besoin qu'il soit compilé lorsque vous travaillez localement, mais que vous savez qu'il sera fourni par le parent, vous pouvez le spécifier en tant que

fourni ma dépendance au lieu de compiler ma dépendance.

Cela lui indique de compiler lors du débogage, mais de ne pas l'empaqueter avec, car la dépendance sera dans la sortie finale comme faisant partie des dépendances fournies par le parent.

Un autre facteur important est de s'assurer que votre fichier proguard est correctement configuré pour ne pas supprimer les annotations et le code basé sur la réflexion. Dagger aura besoin d'une assurance en place dans ces fichiers pour ne pas être supprimé au moment de la minification. Veuillez confirmer ceci en désactivant la minification et proguard sur la version. S'il fonctionne bien, alors votre problème est lié au fichier proguard, s'il a toujours un problème, alors c'est probablement votre gestion des dépendances transitives.

J'espère que cela vous aidera. N'hésitez pas à me faire savoir si vous avez besoin de précisions supplémentaires.

0voto

Mrunal Chauhan Points 104

Essayez d'utiliser ceci gradle artifactory plugin , J'espère que cela vous aidera. voir le lien

Le plugin Gradle Artifactory vous permet de déployer vos artefacts de construction et vos informations de construction vers Artifactory et également de résoudre vos dépendances de construction à partir d'Artifactory.

Construire le snippet script pour l'utiliser dans toutes les versions de Gradle.

    buildscript {
      repositories {
        jcenter()
      }
      dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release"
      }
    }
    apply plugin: "com.jfrog.artifactory"

Construire le snippet script pour l'utiliser dans Gradle 2.1 et supérieur

    plugins {
      id "com.jfrog.artifactory" version "latest.release"
    }

Pour plus d'aide, vous pouvez vous référer au lien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X