41 votes

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

J'ai un tas de tiers libs que je inclure dans mon application de base. Je ne peux pas contrôler la bibliothèque de prise en charge ceux de la 3e partie les modules. Il est difficile d'avoir la même version de l'android support library dans mon application.

Je sais à l'aide de 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 ya une tonne de bibliothèques de prise en charge et à l'exclusion de tous pour chacun de mes 3e partie des bibliothèques semble exagéré.

Est-il un meilleur moyen?

La lecture de ce post de blog: https://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

Elle suggère:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

Toutefois, lorsque l'aide que je reçois toujours un message d'avertissement dans Android Studio, dans ma gradle fichier qu'il existe de multiples versions de la bibliothèque de prise en charge détectée.

Que dois-je faire si mon dépendances dépendent de différentes versions de la bibliothèque de prise en charge? Dans les deux cas ci-dessus, je serais forcer la 3ème partie les bibliothèques à utiliser une version spécifique de la bibliothèque de prise en charge qu'ils n'étaient pas construire avec. Quelle version dois-je utiliser? Dernière bibliothèque de prise en charge? Min bibliothèque de prise en charge de tous les 3ème partie des dépendances?

Ici, c'est un minimum gradle fichier exemple montrant tirant dans la 3ème partie des dépendances que chacun dépendent de leur propre version de la bibliothèque de prise en charge.

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 l'avertissement suivant:

enter image description here

44voto

Mdlc Points 1052

C'est certainement possible. Dans vos projets de construction.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 s'assure que la 'com.android.soutien à la dépendance version sera égal à $supportlib_version pour toutes les dépendances. De même pour le com.google.android.gms-cadre.

Assurez-vous que dans votre module de construire.gradle fichier vous pouvez également utiliser ces versions de vos dépendances. E. g.:

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

Lire plus au sujet de forcer une certaine dépendance de la version Officielle Gradle de la documentation.

Mise à jour Google a découplé les versions de la bibliothèque. Par conséquent, les obligeant à une version spécifique ci-dessus 15.0.0 peut ne pas fonctionner. Au lieu de cela, vous pouvez permettre à un nombre limité de versions. L'exemple ci-dessous permet à toute version supérieure à 15.0.0 mais inférieur à 16.

gps_version = '[15.0.0, 16.0.0)'

0voto

Mateusz Points 501

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 la 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.

0voto

Santanu Sur Points 5061

Faire le targetsdkversion 26 et aussi dans votre gradle apporter des modifications à 26 ou u peut changer votre version compilesdk à 25 et changer vos dependecies pertinents à 25

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