J'ai exporté mon projet depuis Eclipse et importé vers Android Studio en suivant les instructions de ce lien: http://developer.Android.com/sdk/installing/migrate.html =
Quand je construis, j'ai une erreur:
Duplicate files copied in APK META-INF/DEPENDENCIES
Après avoir cherché, j'ai trouvé une solution: ajouter
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
en build.gradle
. Et il fonctionne!
Mais je ne comprends pas pourquoi j'ai eu cette erreur et pourquoi j'ai dû appliquer ce correctif. Quelqu'un peut-il expliquer?
Dans les versions Android Gradle, vous ne pouvez pas inclure plusieurs fois le même fichier avec le même chemin dans le résultat. Dans votre version, il y avait deux META-INF/DEPENDENCIES
fichiers provenant de différents endroits. Comme vous n'avez pas du tout besoin de ce fichier dans votre application, la chose la plus simple à faire est de dire au système de construction de l'ignorer complètement, ce que fait la directive exclude
.
Il existe également une directive pickFirst
pour indiquer au système de construction de conserver un des copies; il y a une infime quantité de détails à ce sujet dans Android Gradle plugin 0.7.0: "Fichiers en double lors de l'emballage de l'APK" .
Les versions d'Android dans Gradle sont plutôt strictes concernant les fichiers en double, ce qui peut rendre la vie difficile. Il existe un problème similaire si vous incluez plusieurs fois la même Java classe, où vous obtenez l'erreur "Plusieurs fichiers Dex définissent" (voir Les fichiers Plusieurs dex définissent Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat ) pour un exemple typique).
Les autres systèmes de construction sont plus cléments. Il est typique dans Java) que si vous incluez la même classe plusieurs fois dans un chemin de classe, par exemple, la première copie visible est celle qui est utilisée; les doublons sont ensuite ignorés. la plupart des cas sont plus faciles à traiter, mais il y a quelques problèmes, le plus important étant qu'il peut y avoir des erreurs subtiles si plusieurs versions différentes d'un fichier se glissent dans la construction sans que vous le sachiez - il peut être difficile de comprendre ce qui se passe. Lorsque vous vous en sortez, vous pouvez généralement le résoudre en jonglant avec l'ordre dans lequel les éléments sont inclus pour vous assurer que celui que vous voulez atteindra le résultat final, mais dans des versions très complexes, cela peut être difficile à obtenir, et Il peut arriver que faire des choses apparemment sans rapport, comme inclure de nouvelles bibliothèques dans votre projet, puisse perturber les commandes et causer beaucoup de problèmes.
Pour cette raison, Gradle a pour philosophie de ne pas se fier aux commandes pour déterminer les "gagnants" dans le jeu de la résolution des doublons et oblige le développeur à rendre toutes les dépendances explicites. La mise en œuvre par Android du système de construction sur Gradle suit cette philosophie.
Bien que la réponse de Scott Barta soit correcte, il manque une solution simple et commune: il suffit d'ajouter
Android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
à votre build.gradle pour ignorer ces doublons.
La solution la plus simple consiste à ajouter
packagingOptions {
pickFirst 'META-INF/*'
}
à votre build.gradle dans Android section
Le moyen le plus simple que j'ai trouvé pour résoudre ce problème consiste à utiliser un caractère générique afin d'éviter de devoir déclarer manuellement chaque fichier en conflit.
packagingOptions {
pickFirst '**'
}