Comment résoudre java.util.zip.ZipException?

Si je tente de déboguer et de déployer mon application Android (dans Android Studio 0.9), j’obtiens l’erreur suivante:

Execution failed for task ':app:packageAllDebugClassesForMultiDex'. java.util.zip.ZipException: duplicate entry: android/support/multidex/BuildConfig.class 

Pour rendre les choses claires, voici un bref historique de mes actions:

  1. Ce matin, le projet fonctionnait bien
  2. Ajout de quelques classes et méthodes supplémentaires
  3. Cassé la limite et reçu cette erreur: Unable to execute dex: method ID not in [0, 0xffff]: 65536
  4. Décider d’append le support multiDex à mon projet car réduire les dépendances n’était pas une option

Depuis, je continue à recevoir l’erreur décrite juste après avoir ajouté multiDex à mon projet en suivant cette publication SO. Utiliser Gradle pour diviser les bibliothèques externes en fichiers DEX séparés pour résoudre les méthodes Android Dalvik 64k .

Voici mon fichier build.gradle:

 apply plugin: 'com.android.application' repositories { jcenter() } android { comstackSdkVersion 21 buildToolsVersion '21.1.0' defaultConfig { applicationId "com.stackoverflow.application" minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" multiDexEnabled = true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dexOptions { preDexLibraries = false } } afterEvaluate { tasks.matching { it.name.startsWith('dex') }.each { dx -> if (dx.additionalParameters == null) { dx.additionalParameters = [] } dx.additionalParameters += '--multi-dex' dx.additionalParameters += "--main-dex-list=$projectDir/".toSsortingng() // enable the main-dex-list } } dependencies { comstack fileTree(dir: 'libs', include: ['*.jar']) comstack project(':viewPagerIndicatorLibrary') comstack 'com.google.android:multidex:0.1' comstack 'com.j256.ormlite:ormlite-android:4.48' comstack 'com.j256.ormlite:ormlite-core:4.48' comstack 'de.greenrobot:eventbus:2.2.1' comstack 'se.emilsjolander:stickylistheaders:2.5.1' comstack 'joda-time:joda-time:2.5' comstack 'com.makeramen:roundedimageview:1.4.0' comstack 'javax.inject:javax.inject:1' comstack 'com.squareup.picasso:picasso:2.3.4' comstack 'com.googlecode.libphonenumber:libphonenumber:6.3.1' comstack('com.google.api-client:google-api-client-gson:1.18.0-rc') { exclude module: 'httpclient' } comstack 'com.google.android.gms:play-services:6.1.71' comstack('com.google.api-client:google-api-client:1.17.0-rc') { exclude(group: 'xpp3', module: 'xpp3') exclude(group: 'org.apache.httpcomponents', module: 'httpclient') exclude(group: 'junit', module: 'junit') exclude(group: 'com.google.android', module: 'android') } comstack('com.google.api-client:google-api-client-android:1.17.0-rc') { exclude(group: 'com.google.android.google-play-services', module: 'google-play-services') } comstack('com.google.http-client:google-http-client-android:1.17.0-rc') { exclude(group: 'com.google.android', module: 'android') } comstack 'com.google.guava:guava:18.0' } 

J’ai aussi d’autres dépendances de projet pour utiliser la bibliothèque viewPagerIndicator ainsi que quelques fichiers JAR dans mon dossier / libs:

  • android-async-http-1.4.6.jar
  • guice-3.0-no_aop.jar
  • jsr305-1.3.9.jar
  • roboguice-2.0.jar

Tout conseil sur la façon dont je pourrais résoudre ce problème sans supprimer aucune de mes dépendances nécessaires est le bienvenu!

Edit: Ceci est un bug et un correctif est dû. Voir https://code.google.com/p/android/issues/detail?id=81804

J’ai aussi ce problème et je n’ai pas de réponse. Mais voici ce que je peux append:

La classe BuildConfig est une classe magique générée dans le cadre du processus de génération. Pour une raison quelconque, il existe une version avec le même nom complet ( android.support.multidex.BuildConfig ) dans mutildex-1.0.0 et multidex-instrumentation-1.0.0 aars.

Je ne crois pas que nous ayons rien fait de mal. Je pense que c’est un symptôme d’être à la pointe. J’ai soulevé un rapport de bogue .

Thread est un peu vieux, mais j’ai aussi cette erreur.

Mon problème était que j’utilisais deux versions différentes de com.google.android.gms: play-services dans mon fichier de gradle.

 comstack 'com.google.android.gms:play-services-gcm:7.5.0' comstack 'com.google.android.gms:play-services-analytics:7.3.0' // WRONG! 

Assurez-vous que vous utilisez toujours les mêmes versions comme:

 comstack 'com.google.android.gms:play-services-gcm:7.5.0' comstack 'com.google.android.gms:play-services-analytics:7.5.0' 

Pour diagnostiquer et résoudre ce problème, exécutez cette commande gradle:

 ./gradlew clean app:dependencies 

Cela listera toutes les dépendances de votre application dans un arbre. Recherchez les résultats de la classe de doublons incriminée et ajoutez

 comstack('naughty.library') { exclude group: 'foo', module: 'bar' } 

pour supprimer le duplicata.

J’ai récemment eu cette erreur, et après avoir examiné mes “bibliothèques externes” dans un studio Android, il s’avère qu’une de mes bibliothèques a été incluse sous deux numéros de version. (Dans ce cas, il s’agissait de runtime 1.5.1 et 1.5.2).

Ce que je recommanderais, c’est de regarder à l’intérieur des “bibliothèques externes” dans votre vue de projet et de voir s’il ya des bibliothèques redondantes. Cela inclut aussi les dépendances transitives, donc vous pouvez trouver quelque chose qui vous surprend.

1.update google play service

2.add

 comstack 'com.google.android.gms:play-services-fitness:8.1.0' comstack 'com.google.android.gms:play-services-wearable:8.1.0' 

au lieu de comstack 'com.google.android.gms:play-services:8.1.0'

dans le fichier build.gradle.

3.

 defaultConfig { multiDexEnabled true } dependencies { comstack 'com.android.support:multidex:1.0.1' } 

Dans mon cas, la raison était Facebook Android SDK. Exclut juste la dépendance transitive:

 comstack('com.facebook.android:facebook-android-sdk:+') { exclude group: 'com.android.support', module: 'multidex' } 

Dans votre cas, cela peut être une autre dépendance – sortingez-les un par un et vous trouverez celui qui a une dépendance multidex transitive.

Si vous activez multiDex, vous devez cesser de faire la logique dans afterEvaluate {} . Le support multi-dex prendra en charge la liste principale de dex pour vous.

Ce type d’erreur, comme la saisie en double, se produit lorsque vous vous trouvez à plusieurs endroits. Pour résoudre ce problème, recherchez simplement dans la classe une entrée en double dans le projet. Il vous montrera tous les chemins où cette classe présente plus d’un endroit. Dans Windows CNTRL + N est un raccourci clavier pour la recherche dans les fichiers. Essayez simplement de supprimer l’un des fichiers ou fichiers et le problème est résolu.

 tools:overrideLibrary="com.google.android.gms.location, com.google.android.gms.internal" 

A fait le tour pour moi (je suppose que vous devriez changer d’emplacement avec n’importe quelle bibliothèque de Google que vous utilisez)

Vous ajoutez une bibliothèque comme celle-ci
(UNE). comstackr des fichiers (‘libs / YOUR_LIBRARY.jar’)
et ce paquet de bibliothèque déjà disponible dans votre code.
commenter comme ou supprimer cette ligne
// comstack les fichiers (‘libs / YOUR_LIBRARY.jar’)

Comment connaître la copie de la bibliothèque dans votre projet:
décompressez votre “YOUR_LIBRARY.jar” et voyez le même nom de classe dans votre code.

allez dans File/Invalidate Chaches/Restart et votre problème est résolu