web-dev-qa-db-fra.com

Comment résoudre Java.util.Zip.ZipException?

Lorsque j'essaie de déboguer et de déployer mon application Android (dans Android Studio 0.9), l'erreur suivante apparaît:

Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
Java.util.Zip.ZipException: duplicate entry: Android/support/multidex/BuildConfig.class

Pour clarifier les choses, 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. Brisé la limite et a reçu cette erreur: Unable to execute dex: method ID not in [0, 0xffff]: 65536
  4. Décidé d'ajouter le support multiDex à mon projet car la réduction des dépendances n'était pas une option

Depuis lors, je continue à avoir l'erreur décrite juste après avoir ajouté multiDex à mon projet en suivant cette SO publication Utilisation de Gradle pour scinder des bibliothèques externes en fichiers dex séparés afin de résoudre les méthodes Android Dalvik 64k limit .

Voici mon fichier build.gradle:

apply plugin: 'com.Android.application'

repositories {
    jcenter()
}

Android {
    compileSdkVersion 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/<filename>".toString() // enable the main-dex-list
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':viewPagerIndicatorLibrary')
    compile 'com.google.Android:multidex:0.1'
    compile 'com.j256.ormlite:ormlite-Android:4.48'
    compile 'com.j256.ormlite:ormlite-core:4.48'
    compile 'de.greenrobot:eventbus:2.2.1'
    compile 'se.emilsjolander:stickylistheaders:2.5.1'
    compile 'joda-time:joda-time:2.5'
    compile 'com.makeramen:roundedimageview:1.4.0'
    compile 'javax.inject:javax.inject:1'
    compile 'com.squareup.picasso:picasso:2.3.4'
    compile 'com.googlecode.libphonenumber:libphonenumber:6.3.1'
    compile('com.google.api-client:google-api-client-gson:1.18.0-rc') {
        exclude module: 'httpclient'
    }

    compile 'com.google.Android.gms:play-services:6.1.71'
    compile('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')
    }
    compile('com.google.api-client:google-api-client-Android:1.17.0-rc') {
        exclude(group: 'com.google.Android.google-play-services', module: 'google-play-services')
    }
    compile('com.google.http-client:google-http-client-Android:1.17.0-rc') {
        exclude(group: 'com.google.Android', module: 'Android')
    }
    compile 'com.google.guava:guava:18.0'
}

J'ai également 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

Tous les conseils sur la façon dont je pourrais résoudre ce problème sans supprimer aucune de mes dépendances nécessaires sont les bienvenus!

50
Aymeric

Edit: Ceci est un bogue 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 ajouter:

La classe BuildConfig est une classe magique générée dans le cadre du processus de construction. Pour une raison quelconque, il existe une version avec le même nom complet (Android.support.multidex.BuildConfig) dans les deux 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 .

13
Synesso

Le fil est un peu vieux, mais j'ai aussi cette erreur.

Mon problème était que j'ai utilisé deux versions différentes Com.google.Android.gms: play-services dans mon fichier de classement.

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

Assurez-vous de toujours utiliser les mêmes versions que:

compile 'com.google.Android.gms:play-services-gcm:7.5.0'
compile 'com.google.Android.gms:play-services-analytics:7.5.0'
32
Dennis Allert

Pour diagnostiquer et résoudre ce problème, exécutez la commande suivante:

./gradlew clean app:dependencies

cela listera toutes les dépendances de votre application dans une arborescence. Recherchez les résultats de la classe en double incriminée et ajoutez 

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

supprimer le duplicata.

12
bsautner

J'ai récemment eu cette erreur, et après avoir examiné mes "Bibliothèques externes" dans Android Studio, il s'avère qu'une de mes bibliothèques avait été incluse sous deux numéros de version. (Dans ce cas, c’était fil-exécution 1.5.1 et 1.5.2).

Ce que je recommanderais, c'est de regarder à l'intérieur de "Bibliothèques externes" dans votre vue Projet et de voir s'il y a des bibliothèques redondantes. Il inclut également les dépendances transitives afin que vous puissiez y trouver quelque chose qui vous surprend.

6
Aaron Sarazan

1.update google play service

2.add

compile 'com.google.Android.gms:play-services-fitness:8.1.0'
compile 'com.google.Android.gms:play-services-wearable:8.1.0'

au lieu de compile 'com.google.Android.gms:play-services:8.1.0'

dans le fichier build.gradle.

3.

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.Android.support:multidex:1.0.1'
}
3
Sanjoy Saha

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

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

Dans votre cas, cela peut être une autre dépendance - il suffit de les trier une par une et vous trouverez celui qui a une dépendance transitive multidex.

1
mixel

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

0
Mahendra Chhimwal

Vous ajoutez une bibliothèque comme celle-ci 
(UNE). compiler des fichiers ('libs/YOUR_LIBRARY.jar')
et ce paquet de bibliothèque déjà disponible dans votre code. 
commentez ou supprimez cette ligne 
// compiler des fichiers ('libs/YOUR_LIBRARY.jar')

Comment connaître les copies de bibliothèque dans votre projet:
décompressez votre "YOUR_LIBRARY.jar" et voyez le même nom de classe dans votre code. 

0
Satendra Behre

Si vous activez multiDex, vous devriez cesser de faire la logique dans afterEvaluate {}. Le support multi-dex s'occupera de la liste principale dex pour vous.

0
Xavier Ducrohet
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 la bibliothèque google que vous utilisez)

0
Meltzer