EXCEPTION DE NIVEAU SUPÉRIEUR INATTENDU: com.android.dex.DexException: plusieurs fichiers dex définis

Lorsque j’ajoute les configurations pour Google Analytics à mon projet Android et que je construis le projet, j’obtiens l’erreur suivante:

:app:transformClassesWithDexForDebug UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Ljavax/inject/Inject; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334) at com.android.dx.command.dexer.Main.run(Main.java:277) at com.android.dx.command.dexer.Main.main(Main.java:245) at com.android.dx.command.Main.main(Main.java:106) FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 * Try: Run with --info or --debug option to get more log output. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithDexForDebug'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:310) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90) at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) at org.gradle.util.Swapper.swap(Swapper.java:38) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) Caused by: org.gradle.internal.UncheckedException: com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:45) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:78) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:243) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:230) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) ... 57 more Caused by: com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at com.android.build.gradle.internal.transforms.DexTransform.transform(DexTransform.java:411) at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:112) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75) ... 63 more Caused by: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:42) at com.android.builder.core.AndroidBuilder.convertByteCode(AndroidBuilder.java:1325) at com.android.build.gradle.internal.transforms.DexTransform.transform(DexTransform.java:396) ... 65 more Caused by: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:365) at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:40) ... 67 more 

Qu’est-ce que cela signifie et comment puis-je éviter cette erreur?

Un peu tard pour le jeu ici, mais c’est très probablement un problème avec les dépendances que vous avez répertoriées dans votre fichier build.gradle pour votre application.

Après de nombreux tests, j’ai réussi à résoudre mon problème et je pense que cela pourrait aider les autres.

Choses que je ne recommande pas:

À moins que vous ayez absolument besoin d’activer multiDex dans votre build.gradle, ne le faites pas, vous évitez tout simplement le problème sous-jacent de votre application et vous ne parvenez pas à la racine. Vous augmentez également inutilement la taille de votre fichier apk, et il peut y avoir des pannes inattendues lorsqu’il existe une méthode conflictuelle dans votre fichier dex.

Choses à surveiller:

Vérifiez toutes vos dépendances dans votre fichier build.gradle. Faites-vous référence à une dépendance qui inclut également une dépendance que vous avez déjà incluse? Par exemple, si vous incluez appcompat-v7, il n’est pas nécessaire d’inclure appcompat-v4 puisque la version 7 inclut toutes les fonctionnalités de la version 4.

CE QUE J’AI ACTUELLEMENT TROUVÉ (MON NUMÉRO provoquant un dépassement de la limite de méthode de mon application dans mon fichier dex) —-> SERVICES GOOGLE PLAY

Si vous n’avez pas besoin de toutes les dépendances de la bibliothèque de services Google Play, restz à l’écart de cette ligne dans votre comstack 'com.google.android.gms:play-services:8.3.0' build.gradle comstack 'com.google.android.gms:play-services:8.3.0' et utilisez simplement ce dont vous avez besoin !!

Google a une liste complète des bibliothèques pour la compilation sélective ici

Cela dit, vous n’avez probablement besoin d’inclure que cette seule ligne dans votre Google Analytics:

  dependencies{ comstack 'com.google.android.gms:play-services-analytics:8.3.0' } 

MODIFIER

En outre, vous pouvez afficher l’arbre de dépendance en accédant à la racine de votre projet (ou en utilisant un terminal dans un studio Android) et en exécutant:

 ./gradlew app:dependencies 

Bonne chance et bon codage!

Mettre à jour

Maintenant, à partir d’Android Studio 2.2, vous n’avez plus besoin d’essayer de savoir si vous devez utiliser plusieurs dex dans votre application. Utilisez l’ Apk Analyzer pour voir si c’est vraiment nécessaire!

Explication: Création d’ applications avec plus de 65K méthodes

Les fichiers d’application Android (APK) contiennent des fichiers de code octet exécutables sous la forme de fichiers Dalvik Executable (DEX), qui contiennent le code compilé utilisé pour exécuter votre application. La spécification Dalvik Executable limite le nombre total de méthodes pouvant être référencées dans un seul fichier DEX à 65 536 , y compris les méthodes du framework Android, les méthodes de bibliothèque et les méthodes de votre propre code. Pour dépasser cette limite, vous devez configurer le processus de génération de votre application afin de générer plusieurs fichiers DEX, appelés configuration multidex.

Remarque: Cela vous permet de vous référer à toutes les méthodes de l’application. C’est comme si vous aviez deux modules (limite: 2 x 65K) mais compactés en un seul. Cela implique un coût (temps) dans le processus de construction.

Solution:

  1. Vous devriez essayer de formater votre code avec des bibliothèques pour supprimer les classes excédentaires et ne pas dépasser les méthodes limites. Par exemple, si vous utilisez maps play-services (com.google.android.gms: play-services: 8.1.0), vous pouvez modifier (comstack) com.google.android.gms: play-services-maps: 8.1. 0 ‘) pour éliminer les dépendances de bibliothèque inutiles. Synchronisez ensuite Gradle dans AndroidStudio et vérifiez si elle s’exécute. Si aucune course passez au point 2.
  2. Ajoutez ceci sur build.gradle (module d’application).
 android { ... defaultConfig { ... multiDexEnabled true } } 

Pour moi, il s’agissait de simplexml converter pour retrofit 2. Et cela corrigé par:

comstack ("com.squareup.retrofit2:converter-simplexml:2.0.0-beta4"){ exclude module: 'stax' exclude module: 'stax-api' exclude module: 'xpp3'}

Prise en charge de Multidex pour Android 5.0 et supérieur

Android 5.0 et versions ultérieures utilisent un environnement d’exécution appelé ART qui prend en charge de manière native le chargement de plusieurs fichiers dex à partir de fichiers d’application APK. ART effectue une pré-compilation au moment de l’installation de l’application, qui parsing les classes (.. N) .dex et les comstack en un seul fichier .oat pour exécution par le périphérique Android. Pour plus d’informations sur l’exécution d’Android 5.0, voir Présentation de ART.

Cela signifie que votre application fonctionnerait bien au niveau 21 ou supérieur de l’API.

Prise en charge de Multidex avant Android 5.0

Les versions de la plate-forme antérieures à Android 5.0 utilisent le moteur d’exécution Dalvik pour exécuter le code de l’application. Par défaut, Dalvik limite les applications à un seul fichier bytecode classes.dex par APK. Pour contourner cette limitation, vous pouvez utiliser la bibliothèque de support multidex, qui devient une partie du fichier DEX principal de votre application, puis gère l’access aux fichiers DEX supplémentaires et au code qu’ils contiennent.

Donc, tout d’abord en vous assurant que vous avez importé une dépendance correcte, ce que vous semblez l’avoir fait.

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

Dans votre manifeste, ajoutez la classe MultiDexApplication de la bibliothèque de prise en charge multidex à l’élément d’application.

    ...   

Sinon, si votre application étend la classe Application , vous pouvez remplacer la méthode attachBaseContext() et appeler MultiDex.install(this) pour activer multidex .

  @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 

Enfin, vous devrez mettre à jour votre fichier build.gradle comme suit en ajoutant multiDexEnabled true :

 defaultConfig { applicationId '{Project Name}' minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" multiDexEnabled true } 

J’espère que cela vous aidera.

dans mon cas, je l’ai eu deux fois dans le fichier build.grade

 comstack 'com.google.android.gms:play-services-auth:8.4.0' 

Une fois que j’ai enlevé la 2ème entrée, ça a bien marché.

Exactement le même problème que j’ai rencontré!

J’ai découvert que c’était dû à des dépendances en double. Dans build.gradle, une dépendance peut être déjà incluse dans d’autres, générant ainsi des conflits. J’ai enlevé les dépendances nécessaires et résolu mon problème.

Qu’est-ce que j’ai fait pour résoudre ce problème est supprimé les changements grades d’ici ( https://developers.google.com/analytics/devguides/collection/android/v4/ ) puis dans Android Studio est entré dans «fichier / structure du projet» puis cliquez sur analytics et si la case est cochée désélectionnez-la, laissez graduellement synchroniser puis cochez à nouveau la case et cliquez sur le bouton pour vous connecter. Après tout cela pour que votre tracker analytique fonctionne, il vous suffit de copier votre tracker dans mTracker = analytics.newTracker() consultez cette page pour obtenir de l’aide. https://developers.google.com/android/reference/com/google/android/gms/analytics/GoogleAnalytics

Inclure des dépendances spécifiques dans le fichier de génération.

Si vous souhaitez append des cartes dans votre application, incluez comstack ‘ com.google.android.gms: play-services-location: 9.2.1


au lieu de comstackr ‘ com.google.android.gms: play-services: 9.2.1

Je pense que vous utilisez Google Analytics SDK V3 utiliser V4 à la place, j’ai également fait face au même problème lors de l’utilisation de SDK V3 de Google Analytics https://developers.google.com/analytics/devguides/collection/android/v4/ voir ce lien pour Plus d’information.

Cela pourrait arriver si vous avez mis à jour Android Studio vers la dernière version 1.4. Avez-vous mis à jour les bibliothèques de support avec les dernières versions? Votre comstackSdkVersion devrait être 23.

 apply plugin: 'com.android.application' android { comstackSdkVersion 23 //update this to 23 buildToolsVersion "21.1.2" defaultConfig { applicationId "your.package.name" minSdkVersion 16 targetSdkVersion 21 multiDexEnabled true //enable this } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { // update these to 23 if you have them and add the multidex comstack 'com.android.support:support-v4:23.0.1' comstack 'com.android.support:appcompat-v7:23.0.1' comstack 'com.android.support:design:23.0.1' comstack 'com.google.android.gms:play-services:+' comstack 'com.android.support:multidex:1.0.1' } 

En fait, j’ai trouvé que le fait d’avoir trop de modules Android Studio consortingbuait à avoir cette erreur sans activer le multidex. Si vous essayez d’éviter d’activer le multidex, la limite semblait être d’environ 26 modules. C’était avec Android Studio 1.5.1

Le même problème mais en utilisant react-native-svg. Cela m’a aidé:

 cd android ./gradlew clean 

La source