Plusieurs fichiers dex définissent Landroid / support / v4 / accessibilityservice / AccessibilityServiceInfoCompat

212

Si je cours à gradle assembleDebugpartir de la ligne de commande, je reçois soudainement cette erreur:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.util.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:592)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:550)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:531)
    at com.android.dx.merge.DexMerger.mergeDexBuffers(DexMerger.java:168)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:186)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:300)
    at com.android.dx.command.dexer.Main.run(Main.java:232)
    at com.android.dx.command.dexer.Main.main(Main.java:174)
    at com.android.dx.command.Main.main(Main.java:91)

Si je grep pour v4, je vois deux fichiers dans mon dossier de build.

Binary file build/pre-dexed/debug/support-v4-19.0.0-2ba5fdd60a6c3836b3104a863fe42897da1fa9d1.jar matches
Binary file build/pre-dexed/debug/support-v4-r7-227d905d79b23b20866531d4f700446c040a2ccb.jar matches

Mon fichier gradle comprend uniquement cette bibliothèque de support:

compile 'com.android.support:support-v13:19.0.0'

Je suis perplexe quant à la façon dont la bibliothèque r7 est incluse en quelque sorte. J'ai couru gradle cleanet il apparaît toujours là lorsque je réexécute assembleDebug.

Si je grep pour r7 dans le répertoire de construction, je le vois dans le fichier:

Binary file build/exploded-bundles/ComGoogleAndroidGmsPlayServices4030.aar/classes.jar matches

Si je n'inclus pas la v13, alors d'autres choses ne se compilent pas.

Mais la v13 n'inclut-elle pas la bibliothèque de support de la v4?

Est-ce une incompatibilité entre le bundle AAR des services de jeu et la bibliothèque v13?

J'ai attrapé le fichier gradle sur gradleplease.appspot.com.

La suppression des services de jeu ne le résout pas; même erreur.

Mes dépendances dans build.gradle:

 dependencies {


 // Google Play Services
//compile 'com.google.android.gms:play-services:4.0.30'

// Support Libraries
//compile 'com.android.support:support-v4:19.0.0'
///compile 'com.android.support:appcompat-v7:19.0.0'
//compile 'com.android.support:gridlayout-v7:19.0.0'
compile 'com.android.support:support-v13:19.0.0'
compile 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5'
compile 'commons-codec:commons-codec:1.9'
compile 'com.madgag:markdownj-core:0.4.1'
compile 'com.wu-man:android-oauth-client:0.0.2'
compile 'com.google.http-client:google-http-client-jackson2:1.17.0-rc'
compile 'org.apache.commons:commons-lang3:3.2'
compile 'com.google.code.gson:gson:2.2.4'
}
xrd
la source
1
J'ai essayé toutes les solutions et il s'est avéré que toutes n'ont pas fonctionné. Ensuite, je viens de créer un nouveau projet avec le même nom et j'ai copié tous les fichiers de l'ancien projet. Et cela fonctionne très bien maintenant. J'espère que ça aide.
Sam003
J'ai eu ce problème avec un composant de support-v13. Après beaucoup de débogage et d'essayer toutes les réponses en vain, j'ai découvert qu'il a été introduit lorsque j'ai essayé d'intégrer kotlin dans le projet qui était un projet Java existant. J'ai supprimé la bibliothèque standard de kotlin et d'autres bibliothèques de kotlin et ça allait. J'essaierais toujours de résoudre le problème avec kotlin mais pour l'instant, je dois travailler. Toute info aiderait aussi, j'adore vraiment kotlin.
clementiano

Réponses:

304

Exécutez gradle -q dependencies(ou gradle -q :projectName:dependencies) pour générer un rapport de dépendance. Vous devriez voir d'où r7vient, comme:

compile - Classpath for compiling the main sources.
+--- com.commonsware.cwac:camera-v9:0.5.4
|    +--- com.actionbarsherlock:actionbarsherlock:4.4.0
|    |    \--- com.google.android:support-v4:r7
|    +--- com.commonsware.cwac:camera:0.5.4
|    \--- com.android.support:support-v4:18.0.+ -> 18.0.0
\--- com.android.support:support-v4:18.0.+ -> 18.0.0

Ensuite, utilisez la excludedirective pour bloquer cette dépendance. Dans mon cas, cela vient de ma bibliothèque CWAC-Camera, et donc j'utilise:

dependencies {
    compile('com.commonsware.cwac:camera-v9:0.5.4') {
      exclude module: 'support-v4'
    }

    compile 'com.android.support:support-v4:18.0.+'
}

(où la deuxième compiledéclaration indique quelle version vous voulez réellement)

Cela devrait clarifier les choses, comme vous le verrez si vous exécutez à nouveau le rapport de dépendance:

compile - Classpath for compiling the main sources.
+--- com.commonsware.cwac:camera-v9:0.5.4
|    +--- com.actionbarsherlock:actionbarsherlock:4.4.0
|    \--- com.commonsware.cwac:camera:0.5.4
\--- com.android.support:support-v4:18.0.+ -> 18.0.0
CommonsWare
la source
3
Existe-t-il une méthode pour inspecter / exclure les modules des dépendances .jar non disponibles sur Maven? gradle dependenciessemble ne pas signaler les dépendances ajoutées aveccompile files('libs/example.jar')
dbro
3
Disons que j'ai deux libs/*.jardépendances avec un module en commun, aucune n'est disponible comme artefact. Existe-t-il un moyen d'effectuer une inspection de dépendance / exclusion de classe similaire?
dbro
2
@dbro: Pas que je sache, mais, encore une fois, je n'ai pas étudié ce point. À mon humble avis, un ou deux de ces fichiers JAR se sentent mal emballés, car le module en commun devrait être intégré dans son propre JAR.
CommonsWare
12
./gradlew -q: projectName: les dépendances ont fonctionné pour moi
Defuera
15
Astuce rapide pour ceux qui excluent un module d'une dépendance de module: vous devez transformer votre compile project(':foo')en compile(project(':foo')) { exclude module: 'support-v4' }. Notez la parenthèse.
espinchi
122

J'ai résolu une erreur similaire en ajoutant le morceau de code suivant à mon fichier build.gradle dans le bloc Android.

android {
    dexOptions {
        preDexLibraries = false
    }
}
mike.tihonchik
la source
4
A travaillé pour moi! Y a-t-il des inconvénients à le faire de cette façon?
Barrie Galitzky du
@BarrieGalitzky Je n'ai rencontré aucun problème jusqu'à présent
mike.tihonchik
3
Merci mec, cela a parfaitement fonctionné pour résoudre le problème! Quoi qu'il en soit, je pense que cela a des effets secondaires .. La tâche assembleDebug est devenue 3 fois plus lente!
Marino
dexOptions introuvable.
Oliver Dixon
10
Après avoir ajouté cela, j'ai eu l'erreur "La traduction a été interrompue". Je suppose que je dois essayer la méthode CommonsWare.
DroidHeaven
36

Puisqu'une image vaut mille mots

Pour faciliter et accélérer la réalisation de cette tâche avec des débutants comme moi. voici les captures d'écran qui montrent la réponse postée par @ edsappfactory.com qui a fonctionné pour moi:

Ouvrez d' abord la vue Gradle sur le côté droit d'Androidstudio, dans l'élément de votre application, allez à Taskspuis Androidcliquez avec le bouton droit androidDependenciespuis choisissez Run:

étape 1

Ensuite, vous verrez quelque chose comme ceci:

Étape 2

La principale raison pour laquelle j'ai posté ce qu'il n'était pas facile de savoir où exécuter un gradle tâche ou les commandes affichées ci-dessus. C'est donc là que les excuser également.

SO, pour exécuter la commande gradle:

Première:

première

Seconde:

seconde

Aussi simple que cela soit.

C'est tout.

Je vous remercie.

MBH
la source
33

Notez également que vous pouvez voir vos dépendances Android, en allant dans votre vue Gradle d'Android Studio et en sélectionnant la cible "androidDependencies".

Un autre conseil: je rencontrais ce problème jusqu'à ce que je supprime la bibliothèque de support v4 du dossier libs à la fois dans le projet et mes projets de module / bibliothèque associés.

Ed Manners
la source
3
Instruction plus spécifique? Impossible de trouver "androidDependencies". Thx
CopperCash
Accédez à la vue Gradle, puis recherchez l'en-tête Toutes les tâches, explorez le nom de votre application, puis explorez ": app", vous y trouverez "androidDependencies".
AutoM8R
2
Où est la vue Gradle?
Paul Beusterien
4
@PaulBeusterien Si vous regardez à l'extrême droite de la fenêtre, il y a un onglet latéral marqué Gradle. Cliquez dessus pour ouvrir une vue épinglée. Le androidDependencies est en fait une tâche
gradle
merci mec, j'ai posté des captures d'écran expliquant votre réponse pour vous faciliter la tâche.
MBH
11

J'ai commencé à obtenir cette erreur lors de la mise à niveau vers ButterKnife 8.5.1. Aucune des autres réponses ici n'a fonctionné pour moi.

J'avais l'habitude gradle -q :app:dependenciesde voir l'arbre, puis j'ai regardé les fichiers JAR jusqu'à ce que je trouve le conflit. Le conflit était que la dépendance de butterknife sur com.android.support:support-compat:25.1.0contient une version de la classe d'accessibilité, etcom.android.support:support-v4:23.1.1 contient également la classe.

Je l'ai résolu en changeant ma dépendance de ceci:

compile 'com.jakewharton:butterknife:8.5.1'

pour ça:

compile('com.jakewharton:butterknife:8.5.1') {
    exclude module: 'support-compat'
}

Cela ne semble pas affecter le fonctionnement de ButterKnife jusqu'à présent.

Edit: Il existe une meilleure solution, qui consistait à mettre à niveau mes bibliothèques de support Android pour correspondre à celles de ButterKnife:

compile('com.android.support:appcompat-v7:25.2.0')
compile('com.android.support:design:25.2.0')
compile 'com.jakewharton:butterknife:8.5.1'
user3562927
la source
garder la version de support pour être la même est une solution simple et exclure le module ne fonctionne pas pour moi.
Jay
J'ai aussi résolu la deuxième solution! Même conflit mais avec Butter Knife version 8.8.1 Exemple: implémentation ('com.jakewharton: butterknife: 8.8.1') {module d'exclusion: 'support-compat'} annotationProcessor 'com.jakewharton: butterknife-compiler: 8.8.1'
GFPF
9

Au cas où quelqu'un découvrirait que la réponse de CommonsWare ne pouvait pas être appliquée au projet de bibliothèque Android, voici l'extrait à corriger

compile (project (': yourAndroidLibrary')) {exclude module: 'support-v13'}

Vous trouverez des problèmes

Méthode DSL Gradle non prise en charge trouvée: «exclude ()»

si vous utilisez le projet de compilation (': yourAndroidLibrary') {exclure le module: 'support-v13'}

Les différences sont le bracelet "(" et ")" avant "projet" .

Tony Thompson
la source
Merci, il manquait une double parenthèse!
Marko
8
exclude module: 'support-v4'

Ne fonctionnerait pas pour moi avec une dépendance de projet, la seule façon de le faire fonctionner était via la syntaxe suivante:

configurations {
    dependencies {
        compile(project(':Android-SDK')) {
            compile.exclude module: 'support-v4'
        }
    }
}

Où: Android-SDK est le nom de votre projet.

Pastille
la source
8

J'ai eu le même problème et il semble que mon application avait trop de méthodes à cause des bibliothèques: http://developer.android.com/tools/building/multidex.html

Résolu avec:

android {
   defaultConfig {
   ...
   multiDexEnabled = true
   }
}

Plus ici Erreur: Échec de l'exécution pour la tâche ': app: dexDebug'. > la commande s'est terminée avec une valeur de sortie non nulle 2

Giannis P
la source
1
Le multidexing peut ralentir le démarrage de votre application, ne l'utilisez que si vous en avez vraiment besoin.
James Goodwin
6

J'ai eu cette même erreur mais c'était parce que j'avais récemment changé de l'utilisation de la v4 à la v13. Donc tout ce que j'avais à faire était de nettoyer le projet.

ashishduh
la source
1
Eu la même erreur après la mise à niveau d'intellij, le nettoyage du projet a résolu le problème.
Vlad Spreys
5

J'ai eu la même erreur sur un projet hérité. Ma faute était que la bibliothèque de support a été incluse deux fois: une fois à l'intérieur de la bibliothèque google-play-services, et une autre en tant que autonome.

Voici comment je l'ai corrigé:

BAD build.gradle:

dependencies {
   compile files('libs/android-support-v4.jar') 
   compile files('libs/core-2.2.jar')
   compile files('libs/universal-image-loader-1.8.5-with-sources.jar')
   compile 'com.google.android.gms:play-services:3.2.65'
}

BON build.gradle:

dependencies {
   // compile files('libs/android-support-v4.jar')  // not needed 
   compile files('libs/core-2.2.jar')
   compile files('libs/universal-image-loader-1.8.5-with-sources.jar')
   compile 'com.google.android.gms:play-services:3.2.65'
}

J'espère que cela aide quelqu'un :-)

voghDev
la source
3

J'utilise com.google.android.gms:play-services-analytics:8.3.0et je n'ai android-support-v13.jarpas pu exclude module: 'support-v4'travailler.

Ce qui a fonctionné pour moi, c'est d'utiliser l' android-support-v13artefact plutôt que le android-support-v13.jarfichier.

C'est à dire au lieu de

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile files('libs/android-support-v13.jar')

}

j'ai utilisé

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile ('com.google.android:android-support-v13')

}

barry
la source
3

Dans mon cas, le problème était dû à une incohérence de version :

Build tools 25
compileSdk 24
targetSdk 24
Support library 24

La solution était simple: Make everything version 25

Coureur du vent
la source
3

Une méthode similaire de résolution des problèmes dex

gradle.build contenait:

compile files('libs/httpclient-4.2.1.jar')
compile 'org.apache.httpcomponents:httpclient:4.5'
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'

Le problème a été résolu lorsque j'ai supprimé

compile files('libs/httpclient-4.2.1.jar') 

Mon gradle ressemble maintenant à:

apply plugin: 'com.android.application'

android {

compileSdkVersion 24
buildToolsVersion "24.0.3"

defaultConfig {
    applicationId "com.mmm.ll"
    minSdkVersion 16
    targetSdkVersion 24
    useLibrary  'org.apache.http.legacy'
}

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}

dependencies {

compile 'com.google.android.gms:play-services:6.1.+'
compile files('libs/PayPalAndroidSDK.jar')
compile files('libs/ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies.jar')
compile files('libs/picasso-2.1.1.jar')
compile files('libs/gcm.jar')
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

Il y avait une redondance dans le fichier JAR et le projet gradle compilé

Recherchez donc attentivement les fichiers de dépendance et les fichiers jar ayant les mêmes classes.

Et supprimez la redondance.
Cela a fonctionné pour moi.

vn brillant
la source
2

Si vous avez importé votre projet depuis Eclipse .

1. The select project 
2. Go to File -> **Project Structure**
3. Select app in **module** section on left hand panel
4. Select **Dependency** tab
5. Your able to see jars you have added in eclipse project for v4 and v13.
6. Remove that jar by clicking on minus sign at bottom after selection
7. Click on Plus sign select **Library Dependency** 
8. Choose V4 and V13 if added
9. Press Ok and Clean and Rebuild your project

Le scénario que j'ai rencontré après l'importation du projet Eclipse dans Android studio.

J'espère que cela t'aides..

MobileEvangelist
la source
2

Il s'agit d'un problème ennuyeux, qui peut prendre un certain temps pour découvrir le cas racine. La façon dont vous devez procéder est la réponse @CommonsWare.

J'ai récemment rencontré ce problème et j'ai eu du mal à le résoudre.

Mon problème était que j'incluais une bibliothèque par version "+" dans build.gradle. La dernière version de la bibliothèque contenait l'un des anciens dex et bang.

Je suis revenu à une ancienne version de la bibliothèque et je l'ai résolue.

Il est bon d'exécuter vos dépendances android et de voir ce qui se passe réellement. Il est également bon de rechercher dans votre dossier de construction.

Surtout Android Studio 2.2 fournit des fonctionnalités de construction pour suivre ce problème.

Happy Coding Guys

Arun C
la source
2

Dans Android Studio, accédez à votre build.gradle (vérifiez les fichiers build.gradle du projet et des modules) et recherchez les dépendances en double.

Supprimez ceux dont votre projet n'a pas besoin.

KadoLakatt
la source
2

La suppression de tous les fichiers du cache Gradle a résolu mon problème.

sous Linux:

rm -rf ~/.gradle/caches/*
Yuliia Ashomok
la source
1

J'ai supprimé la compilation «com.android.support:support-v4:18.0.+» dans les dépendances, et cela fonctionne

Albert
la source
2
cela devrait être un commentaire, sinon vous devriez l'expliquer d'une meilleure façon.
Anirudh Sharma
1

J'ai pu résoudre le problème dans mon projet natif React en ajoutant simplement

configurations {
        all*.exclude group: 'com.android.support', module: 'support-compat'
        all*.exclude group: 'com.android.support', module: 'support-core-ui'
    }

à la fin de mon fichier android \ app \ build.gradle

Yusuf Khan
la source
0

Enfin, je l'ai résolu en modifiant ces attributs sur le fichier de module gradle

  1. compileSdkVersion 25
  2. targetSdkVersion 25
  3. compilez 'com.android.support:appcompat-v7:+'
  4. compilez 'com.android.support:recyclerview-v7:+'
Val Martinez
la source
0

J'ai eu le même problème lors de l'ajout react-native-paletteà mon projet, voici mon arbre de dépendances:

./gradlew app:dependencies
+--- project :react-native-palette
|    +--- com.facebook.react:react-native:0.20.+ -> 0.44.2
|    |    +--- javax.inject:javax.inject:1
|    |    +--- com.android.support:appcompat-v7:23.0.1
|    |    |    \--- com.android.support:support-v4:23.0.1
|    |    |         \--- com.android.support:support-annotations:23.0.1 -> 24.2.1
...
|    \--- com.android.support:palette-v7:24.+ -> 24.2.1
|         +--- com.android.support:support-compat:24.2.1
|         |    \--- com.android.support:support-annotations:24.2.1
|         \--- com.android.support:support-core-utils:24.2.1
|              \--- com.android.support:support-compat:24.2.1 (*)
+--- com.android.support:appcompat-v7:23.0.1 (*)
\--- com.facebook.react:react-native:+ -> 0.44.2 (*)

J'ai essayé de nombreuses solutions et je n'ai pas pu le réparer, jusqu'à ce que je change la com.android.support:appcompatversion android/app/build.gradle, je souhaite que cela puisse aider

dependencies {
    compile project(':react-native-palette')
    compile project(':react-native-image-picker')
    compile project(':react-native-camera')
    compile fileTree(dir: "libs", include: ["*.jar"])
    // compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.android.support:appcompat-v7:24.2.1"
    compile "com.facebook.react:react-native:+"
}

il semble que les entrées multiples ne soient pas un gros problème, la non-concordance de version est

matrice
la source
0

compile file('...')Je l'ai fait fonctionner pour un conflit en augmentant minSdkVersion à 21 et en activant le multidex. Je ne sais pas si c'est la meilleure solution, mais la seule façon de le faire fonctionner dans mon cas.

Remarque: car compile file('...')il semble que vous ne puissiez pas insérer de excludeclause, cette option n'était donc pas disponible.

Ben Kleywegt
la source
0

J'ai eu le même problème, et ma solution change la version de support '27. + '(27.1.0) en '27 .0.1'

Mingyong Gu
la source
0

J'ai eu le même problème. Dans mon projet, j'avais les dépendances suivantes:

  • appcompat-v7
  • android-support-v13

Pour des raisons héritées, l'application compatible a été récupérée à partir du référentiel Google Maven, tandis que le support android était un .jar local.

Lorsque j'ai compris cela et remplacé cette référence locale par une référence maven, cela a juste résolu mon problème de construction.

Voici la différence de mon application / build.gradle:

entrez la description de l'image ici

kall2sollies
la source
0

J'ai résolu tous mes problèmes en l'ajoutant à project.properties

cordova.system.library.7=com.android.support:appcompat-v7:27.1.0
eatmeimadanish
la source
0

Reçu l'erreur suivante

L'exécution a échoué pour la tâche ': app: transformDexArchiveWithDexMergerForDebug'.

com.android.build.api.transform.TransformException: com.android.dex.DexException: plusieurs fichiers dex définissent Landroid / support / constraint / ConstraintSet $ ​​1

Correction: allez dans Build -> Clean Project

Ragunath CR
la source
Bonjour à Stack Overflow. Mais s'il vous plaît ne répétez pas les réponses, en plus d'avoir déjà 24 réponses, la construction propre a déjà été fournie comme réponse par ashishduh. Merci!
Elletlar