3 votes

La mise à jour des versions de la bibliothèque provoque un échec de la construction dans le projet qui dépend de la bibliothèque

Nous maintenons une bibliothèque Android. Dernièrement, nous avons mis à jour gradle, compileSdkVersion et les versions de la bibliothèque de support. (en utilisant uniquement com.Android.support:design). Nous avons également mis à jour gcm-play-services. La bibliothèque est publiée sur Artifactory avec ses dépendances également dans un fichier pom. Cette mise à jour fonctionne parfaitement sur les projets avec des outils de construction et des bibliothèques de support à jour. Cependant, nous rencontrons un problème avec les projets obsolètes qui utilisent notre bibliothèque. Voici les versions de la bibliothèque.

gradle android plugin -> 3.2.1
compileSdkVersion -> 28
targetSdkVersion -> 28
support library version -> 28.0.0

Voici les versions du projet

compileSdkVersion -> 26
targetSdkVersion 26
support library version -> 26.0.1

et dépendances de la bibliothèque de support client

implementation 'com.android.support:cardview-v7:' + androidSupportV
implementation 'com.android.support:recyclerview-v7:' + androidSupportV
implementation 'com.android.support:appcompat-v7:' + androidSupportV
implementation 'com.android.support:design:' + androidSupportV
implementation 'com.android.support:support-v4:' + androidSupportV
implementation 'com.android.support:support-annotations:28.0.0'

après avoir essayé de construire le projet avec la nouvelle bibliothèque, la construction échoue avec ce journal.

AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values-v28/values-v28.xml","position":{"startLine":8,"startColumn":4,"startOffset":447,"endLine":11,"endColumn":12,"endOffset":684}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/Users/umutyusuf/Documents/repo/core-bootstrap/core-android-client-app/PointrSample-Ozion-v5.0.8/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml","position":{"startLine":10}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/fontVariationSettings not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/ttcIndex not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}

Nous évitons de faire des manipulations dans le code du projet, donc nous avons essayé de le résoudre dans la bibliothèque.

Nous rétrogradons toutes les versions pour qu'elles correspondent aux versions du projet. Et nous le publions à nouveau avec

compileSdkVersion -> 26
targetSdkVersion 26
support library version -> 26.0.1

Mais après cela, nous sommes confrontés à une erreur manifeste de fusion.

Error:
    Attribute meta-data#android.support.VERSION@value value=(26.0.1) from [com.android.support:cardview-v7:26.0.1] AndroidManifest.xml:25:13-35
    is also present at [com.android.support:support-v4:26.1.0] AndroidManifest.xml:28:13-35 value=(26.1.0).
    Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:23:9-25:38 to override

Ceci provient de gcm-play-services dont la dépendance transitive support-v4:26.1.0 est listée dans l'arbre des dépendances.

et pour le résoudre, j'ai ajouté ceci au manifeste

<meta-data
            tools:node="replace"
            tools:replace="android:value"
            android:name="android.support.VERSION"
            android:value="26.0.1" />

Cela a permis de tout faire fonctionner. Mais maintenant, quels seraient les inconvénients de mettre cette balise méta dans le fichier AndroidManifest ?

Nous avons testé cette approche avec toutes les versions de compileSdkVersion 26, 27, 28 et toutes les versions correspondantes de la bibliothèque de support. Toutes semblent fonctionner.

Nous sommes à la recherche de meilleures approches à ce sujet.

Solution alternative que nous avons essayée

Nous avons publié la dépendance de la bibliothèque de support dans la portée fournie. Mais dans ce cas, les projets utilisant la bibliothèque doivent ajouter leur bibliothèque de conception de support pour pouvoir l'utiliser sans problème. Mais même s'ils ajoutent la bibliothèque de support, cela poserait-il un problème si le projet avait une version de la bibliothèque de support différente de celle avec laquelle elle est compilée ?

1voto

Elican Doenyas Points 101

Ces métadonnées du manifeste peuvent causer des problèmes si votre client utilise une bibliothèque de support qui force une autre version d'Android.support de la même manière dans son manifeste. Évitez donc d'utiliser cette ligne dans votre SDK. La publication avec la portée "provided" ne fonctionnera pas non plus et provoquera des plantages si votre client ne fournit pas de bibliothèque de support comme vous l'avez dit.

La solution que j'ai trouvée est d'utiliser support:design:27.1.0 . Il s'agit de la bibliothèque magique qui n'entre en conflit avec aucune autre version des bibliothèques de support. Après plusieurs jours d'essais, j'ai été très heureux de constater que cela résout le problème et ne provoque pas de plantage si le tiers utilise une autre version de support design. J'espère que cela résoudra également votre problème.

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