Comment gérer les différentes versions des bibliothèques de support pour les deps tiers avec gradle?

j'ai un tas de libs de tiers que j'inclus dans mon application de base. Je ne peux pas contrôler la bibliothèque de soutien que ces modules tiers incluent. Cela rend difficile d'avoir la même version de la bibliothèque de soutien android dans mon application.

je sais utiliser gradle quand je peux exclure certaines bibliothèques de chaque dépendance:

compile('com.test:lib1:1.0.0') {
    exclude group: 'com.android.support'
}

cependant il y a une tonne de bibliothèques de soutien et en les excluant toutes pour chacune de mes bibliothèques de tiers semble comme exagéré.

y a-t-il un meilleur moyen?

lire ce billet de blog: https://www.devsbedevin.com/android-understanding-gradle-dependencies-and-resolving-conflicts/

Il suggère:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

Cependant en utilisant cela je reçois toujours un avertissement dans Android Studio dans mon fichier gradle qu'il y a plusieurs versions de la bibliothèque de soutien détectées.

Que dois-je faire si mon dépendances dépendent de différentes versions de la une bibliothèque de soutien? Dans les deux cas ci-dessus, je forcerais les bibliothèques tierces à utiliser une version spécifique de la bibliothèque de support avec laquelle elles n'ont pas été construites. Quelle version dois-je utiliser? Dernière bibliothèque de soutien? Min bibliothèque de soutien de toutes les dépendances de tiers?

voici un exemple de fichier gradle minimal montrant tirer dans les dépendances de tiers que chacun dépend de leur propre version de la bibliothèque de soutien.

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 17
        targetSdkVersion 25
    }
}

configurations.all {
    resolutionStrategy {
        preferProjectModules()
    }
}

dependencies {
    compile 'com.android.support:support-v13:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

Android studio donne le suivant avertissement:

enter image description here

25
demandé sur user5377037 2017-12-29 21:45:05
la source

4 ответов

C'est certainement possible. Dans vos projets construire.gradle fichier (le premier niveau de construction.gradle fichier) ajouter le bloc de code suivant:

ext {
    supportlib_version = '26.1.0'
    gps_version = '11.2.0'
}

//Ensure that all dependencies use the same version of the Android Support library
subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$supportlib_version"
            }
            if (details.requested.group == 'com.google.android.gms'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$gps_version"
            }
        }
    }
}

le code suivant assure que le ' com.Android.la version de dépendance du support sera égale à $ supportlib_version pour toutes les dépendances. De même pour le com.Google.Android.gms-cadre.

assurez-vous que dans la construction de votre module.vous utilisez aussi ces versions pour vos dépendances. E. g.:

compile "com.android.support:support-v4:$supportlib_version"

pour en savoir plus sur le fait de forcer une certaine version de dépendances dans le Officiel Gradle documentation.

mise à Jour Google a découplé les versions des bibliothèques. Par conséquent, forcer une version spécifique au-dessus de 15.0.0 pourrait ne pas fonctionner. Au lieu de cela, vous pouvez autoriser une gamme limitée de versions. L'exemple ci-dessous permet toute version supérieure à 15.0.0 mais inférieure à 16.

gps_version = '[15.0.0, 16.0.0)'
22
répondu Mdlc 2018-08-21 22:08:39
la source

Premier cas: Vous avez compatible libs qui ont déjà mis à jour leur propre libs, Pas de problème ici.

Deuxième cas: Vous avez libs dans votre projet qui ont une version plus haute que les autres libs contenu interne à autre libs, et ces libs peut être mis à jour vers une nouvelle version sans ce problème, aussi pas de problème ici.

Pire cas: vous avez des libs dans votre projet qui ont une version plus haute que les autres libs contenu interne à autre libs, et ces libs n'a pas de nouvelle version qui a déjà été mise à jour en interne libs, et propose des solutions pour que:

  1. téléchargez cette bibliothèque et incluez-la dans votre appprojetimplementation project(':library') et de mettre à jour leur libs.
  2. ou Utilisez plutôt une autre bibliothèque.

N'oubliez pas d'utiliser ./gradlew app:dependencies à vérifier vos dépendances.

3
répondu 2017-12-29 22:13:33
la source

vous devez spécifier la dépendance, avec votre version désirée, qui est à l'origine du conflit avant les libs qui en ont besoin. Si vous faites cela, ces lib utiliseront votre version de dépendances spécifiée.

exemple avec libs (de message d'avertissement) de votre screenshot

dependencies {
    compile 'com.android.support:support-v13:26.0.0'
    compile 'com.android.support:support-compat:26.0.0'
    compile 'com.android.support:animated-vector-drawable:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

continuez à ajouter des dépendances (qui apparaissent dans l'avertissement de votre screenshot) jusqu'à ce qu'il n'y ait plus de message d'avertissement sur les différentes versions de la bibliothèque.

0
répondu Mateusz 2018-01-02 21:16:23
la source

targetsdkversion26 et aussi dans votre Grad faire des changements à 26 ou u peut changer votre version compilesdk à

0
répondu Santanu Sur 2018-01-02 22:10:17
la source