web-dev-qa-db-fra.com

Android Studio: fichiers en double copiés dans APK META-INF / DEPENDENCIES lors de la compilation.

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?

35
TrungNVT

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.

38
Scott Barta

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.

62
Jehy

La solution la plus simple consiste à ajouter

 packagingOptions {
    pickFirst  'META-INF/*'
}

à votre build.gradle dans Android section

10
Jorge Arimany

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  '**'
}
2
Mapsy

Si vous rencontrez des problèmes lors de l’envoi du nouveau fichier .apk vers le Google Play Store, après la mise à jour Android Studio;

cliquez sur la signature V1 Jar pas la signature Apk complète lors de la génération d'un nouvel Apk avec ancien Magasin de clés

V1 Jar Signature

enter image description here

0
Sam