web-dev-qa-db-fra.com

Comment gérer les différentes versions de la bibliothèque de support pour les dépositaires tiers avec gradle?

J'ai un groupe de bibliothèques tierces que j'inclus dans mon application de base. Je ne peux pas contrôler la bibliothèque de support que ces modules tiers incluent. Il est donc difficile d’avoir la même version de la bibliothèque de support 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 existe une tonne de bibliothèques de support technique, et les exclure toutes pour chacune de mes bibliothèques tierces semble être excessif.

Y a-t-il un meilleur moyen?

Lire ce billet de blog: https://www.devsbedevin.net/Android-understanding-gradle-dependencies-and-resolving-conflicts/

Ça suggère:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

Cependant, lorsque je l'utilise, un message d'avertissement s'affiche toujours dans Android Studio dans mon fichier de classement) indiquant que plusieurs versions de la bibliothèque de support ont été détectées.

Que faire si mes dépendances dépendent de différentes versions de la bibliothèque de support? 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'avaient pas été créées. Quelle version dois-je utiliser? Dernière bibliothèque de support? Min bibliothèque de support de toutes les dépendances tierces?

Voici un exemple de fichier de niveau minimal illustrant l'intégration de dépendances tierces dépendantes de leur propre version de la bibliothèque de support.

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
}

Le studio Android donne l'avertissement suivant:

enter image description here

38
lostintranslation

C'est certainement possible. Dans votre fichier build.gradle de projets (le fichier build.gradle de niveau supérieur), ajoutez 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 garantit que la version de dépendance 'com.Android.support' sera égale à $ supportlib_version pour toutes les dépendances. Même chose pour le framework 'com.google.Android.gms'.

Assurez-vous que, dans le fichier build.gradle de votre module, vous utilisez également ces versions pour vos dépendances. Par exemple.:

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

En savoir plus sur le forçage d'une certaine version de dépendance dans Documentation officielle de Gradle .

Mise à jour Google a des versions de bibliothèque découplées . Par conséquent, forcer une version spécifique supérieure à 15.0.0 risque de ne pas fonctionner. Au lieu de cela, vous pouvez autoriser un nombre limité de versions. L'exemple ci-dessous autorise toute version supérieure à 15.0.0 mais inférieure à 16.

gps_version = '[15.0.0, 16.0.0)'
42
Mdlc

Premier cas: Vous avez des libs compatibles qui ont déjà mis à jour leurs propres libs internes , pas de problème ici.

Deuxième cas: Vous avez des bibliothèques dans votre projet qui ont une version supérieure à celle des autres bibliothèques contenait interne à d'autres libs , et ces libs peut être mis à jour vers la nouvelle version sans problème de ce type, également Aucun problème ici.

Le pire des cas: Vous avez dans votre projet des bibliothèques qui ont une version supérieure à celle des autres bibliothèques contenues de manière interne à d'autres libs , et ces libs n'ont pas de nouvelle version qui a déjà été mise à jour en interne libs , solutions suggérées pour cela:

  1. Téléchargez cette bibliothèque et incluez-la dans votre application en tant que projet implementation project(':library') et mettre à jour leurs bibliothèques internes .
  2. OU Utilisez une autre bibliothèque à la place.

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

De plus, je pense qu’il devrait être possible de le faire automatiquement.

3
user6490462

Faire le targetsdkversion26 et aussi dans votre grade apporter des modifications à 26 ou vous pouvez changer votre version de compilesdk à 25 et changez vos dépendances pertinentes en 25

0
Santanu Sur

Vous devez spécifier la dépendance, avec la version de votre choix, qui provoque le conflit avant les bibliothèques qui en ont besoin. Si vous faites cela, ces bibliothèques utiliseront votre version de dépendance spécifiée.

Exemple avec libs (à partir d'un message d'avertissement) depuis votre capture d'écran

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 capture d'écran) jusqu'à ce qu'il n'y ait plus de message d'avertissement concernant les différentes versions de la bibliothèque.

0
Mateusz