Android Studio: dupliquer les fichiers copiés dans APK META-INF / DEPENDENCIES lors de la compilation
j'ai exporté mon projet depuis Eclipse et l'ai importé vers Android Studio en utilisant 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 recherche, j'ai trouvé une solution: ajouter
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
en build.gradle
. Et ça marche!!!
Mais je ne comprends pas pourquoi j'ai eu cette erreur et pourquoi J'ai eu pour appliquer ce correctif. Quelqu'un peut-il m'expliquer?
5 réponses
dans les constructions Android Gradle, vous n'êtes pas autorisé à inclure le même fichier avec le même chemin plus d'une fois dans la sortie. Dans votre Compilation, il y avait deux fichiers META-INF/DEPENDENCIES
venant d'endroits différents. Puisque vous n'avez pas besoin de ce fichier dans votre application, la chose la plus simple à faire est de dire au système de compilation de l'ignorer complètement, ce que fait cette directive exclude
.
il y a aussi une directive pickFirst
pour dire au système de construction de gardez un des copies; il y a une petite quantité de détails sur cela dans Android Gradle plugin 0.7.0:" fichiers dupliqués pendant l'empaquetage D'APK " .
Android construit dans Gradle sont plutôt strictes sur les fichiers dupliqués, ce qui peut rendre la vie difficile. Il y a un problème similaire si vous incluez la même classe Java plus d'une fois, où vous obtenez l'erreur "définir plusieurs fichiers dex" (voir définir plusieurs fichiers dex Landroid/support/v4/accessibilityservice / AccessibilityServiceInfoCompat ) pour un exemple typique).
d'Autres systèmes de construction sont plus clémentes. Il est typique en Java que si vous incluez la même classe plus d'une fois dans un classpath, par exemple, la première copie qu'il voit est celle qui est utilisée; les doublons après ceux-ci sont ignorés. C'est dans la plupart des cas, plus facile à gérer, mais il a quelques problèmes. Le plus important est qu'il peut être subtile erreurs si plusieurs différentes versions d'un fichier se glissent dans la construction sans que vous le sachiez -- il peut être difficile de comprendre ce qui se passe. Quand vous le résolvez, vous pouvez habituellement le résoudre en jonglant avec l'ordre dans lequel les choses sont incluses pour vous assurer que celle que vous voulez rend à la sortie finale, mais dans les constructions très complexes, cela peut être difficile à réaliser, et il peut arriver que faire des choses apparemment sans rapport, comme inclure de nouvelles bibliothèques dans votre projet, peut perturber la commande et mener à beaucoup de malheur.
pour cette raison, Gradle a la philosophie de ne pas compter sur l'ordre des choses pour déterminer les" gagnants " dans le jeu de résoudre les doublons, et il force le développeur à rendre toutes les dépendances explicites. La mise en œuvre d'Android de son système de construction sur le dessus de Gradle suit cette philosophie.
alors que la réponse de Scott Barta est 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 taille.Grad pour ignorer ces doublons.
la solution la plus simple est d'ajouter
packagingOptions {
pickFirst 'META-INF/*'
}
à votre taille.gradle dans la section android
la façon la plus facile que j'ai trouvée pour résoudre ce problème est d'utiliser un joker, de sorte que vous ne vous trouvez pas avoir à déclarer manuellement chaque fichier en conflit.
packagingOptions {
pickFirst '**'
}
dans le cas où quelqu'un ayant ce problème lors du téléchargement de nouveau .apk to Google Play Store, after updatng Android Studio ;
, cliquez sur V1 Pot Signature pas Full Apk Signature tout en Générant de nouveaux Apk avec l'ancien fichier