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:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
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:
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!
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 .
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'
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.
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.
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'
}
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
.
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.
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.
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.
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)