web-dev-qa-db-fra.com

EXCEPTION DE HAUT NIVEAU INATTENDUE: com.Android.dex.DexException: plusieurs fichiers dex définissent

Lorsque j'ajoute les configurations pour google analytics à mon projet Android et que je construis le projet, l'erreur suivante apparaît:

: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?

45
confile

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

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

Choses que je ne recommande pas:

Sauf si vous avez un besoin absolu d'activer multiDex dans votre build.gradle , NE LE FAITES PAS , il s’agit simplement de surmonter le problème sous-jacent dans votre application et de ne pas aller à la racine de celui-ci. Vous augmentez également inutilement la taille de votre apk et il pourrait y avoir des plantages imprévus s’il existe une méthode en conflit dans votre fichier dex.

Les 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 car la v7 inclut toutes les fonctionnalités de la v4.

CE QUE J'AI ACTUELLEMENT TROUVÉ (MON NUMÉRO entraînant le dépassement de la limite de la méthode dans mon fichier dex) ----> SERVICES DE PLAY PLAY

Si vous n'avez pas besoin de toutes les dépendances de la bibliothèque de services Google Play , RESTEZ LOIN à partir de cette ligne dans votre build.gradle compile 'com.google.Android.gms:play-services:8.3.0' et utilisez simplement ce dont vous avez besoin!

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

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

  dependencies{
       compile 'com.google.Android.gms:play-services-analytics:8.3.0'
  }

[~ # ~] éditer [~ # ~]

En outre, vous pouvez afficher l’arbre des dépendances en allant à la racine de votre projet (ou en utilisant le terminal dans Android studio) et en exécutant:

./gradlew app:dependencies

Bonne chance et codage heureux!

Mettre à jour

Désormais, à partir de Android Studio 2.2, vous n’avez plus besoin d’essais et d’erreurs si vous devez utiliser plusieurs-dex dans votre application. Utilisez le Apk Analyzer pour voir si vraiment besoin!

97
kandroidj

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

Les fichiers d'application Android (APK) contiennent des fichiers bytecode 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 fichier DEX unique à 65 536 , y compris Android = méthodes d'infrastructure, méthodes de bibliothèque et méthodes dans votre propre code Pour dépasser cette limite, vous devez configurer votre processus de construction de l'application de manière à générer plusieurs fichiers DEX, appelés configuration multidex.

Remarque: Ceci vous permet de faire référence à toutes les méthodes de l'application. C'est comme si vous aviez deux modules (limite: 2 x 65K) mais compactés en un. Cela entraîne 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 en excès et ne pas dépasser les méthodes limit. Par exemple, si vous utilisez des cartes play-services (com.google.Android.gms: play-services: 8.1.0), vous pouvez passer à (compiler 'com.google.Android.gms: play-services-maps: 8.1. 0 ') pour éliminer les dépendances inutiles de la bibliothèque. Ensuite, synchronisez Gradle dans AndroidStudio et vérifiez s’il fonctionne. Si non couru aller au point 2.
  2. Ajoutez ceci sur build.gradle (module d'application).
Android {
   ...
   defaultConfig {
      ...
      multiDexEnabled true
   }
}
12
SergioLucas

Pour moi, il était lié au convertisseur simplexml pour la modification 2. Et cela a été corrigé par:

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

5
Denis Nek

Support Multidex pour Android 5.0 et versions supérieures

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 APK de l'application. ART effectue une pré-compilation au moment de l'installation de l'application, qui analyse les fichiers de classes (.. N) .dex et les compile en un seul fichier .oat à exécuter par le périphérique Android. Pour plus d'informations sur les l'exécution Android 5.0, voir Présentation de ART.

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

Support Multidex antérieur à Android 5.

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

Donc, premièrement, assurez-vous que vous avez importé la dépendance correcte, ce qui semble être le cas.

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

Dans votre manifeste, ajoutez la classe MultiDexApplication de la bibliothèque de support multidex à l'élément application.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.Android.multidex.myapplication">
    <application
        ...
        Android:name="Android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

Alternative à cela, 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 ci-dessous 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.

3
Bhavesh Patadiya

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 déjà être incluse dans d'autres, générant ainsi des conflits. J'ai supprimé les dépendances nécessaires et résolu mon problème.

2
JohannaX

dans mon cas, j'ai eu cela deux fois dans le fichier build.grade

compile 'com.google.Android.gms:play-services-auth:8.4.0'

Une fois que j'ai supprimé la 2ème entrée, cela a bien fonctionné.

2
techtinkerer

Incluez des dépendances spécifiques dans le fichier de construction.

Si vous souhaitez ajouter des cartes dans votre application, alors inclut compilez 'com.google.Android.gms: emplacement des services de jeu: 9.2.1 '


au lieu de compiler 'com.google.Android.gms: play-services: 9.2.1'

1
Vikas

Ce que j’ai fait pour résoudre ce problème est supprimé des modifications apportées ici ( https://developers.google.com/analytics/devguides/collection/Android/v4/ ) puis dans Android Studio est entré dans 'Structure de fichier/projet' puis cliquez sur analytique et si la case est cochée, décochez-la, puis cochez à nouveau la case puis cochez la case puis cliquez sur le bouton pour vous connecter. Après tout cela, pour obtenir votre suivi analytique En travaillant, il vous suffit de copier votre identifiant de tracker actuel dans mTracker = analytics.newTracker(<here>), consultez cette page pour obtenir de l'aide. https://developers.google.com/Android/reference/com/google/Android/gms/analytics/GoogleAnalytics

1
Ryan Johnston

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

cd Android
./gradlew clean

Source

0
Zdeněk

De Android site Web du développeur:

Android 5.0 (API de niveau 21) et supérieur utilise un environnement d'exécution appelé ART qui prend en charge de manière naïve le chargement de plusieurs fichiers DEX à partir de fichiers APK.

J'ai réglé le min SDK sur 21 et le problème a été résolu (bien sûr, vous devez vérifier votre cas spécifique si le réglage de min-SDK à 21 ou plus vous convient)

0
Chehadeh

En fait, j'ai constaté qu'avoir trop de Android modules de Studio contribuait à avoir cette erreur sans activer Multidex. Si vous essayez d'éviter d'activer Multidex, la limite semble se situer autour de 26 modules. C'est avec = Android Studio 1.5.1

0
Android-Christensen

je pense que vous utilisez Google Analytic SDK V3 utiliser V4 au lieu de cela, j'ai également faire face au même problème lors de l'utilisation de SDK V3 de Google Analytic https://developers.google.com/analytics/devguides/collection/Android/v4/ voir ce lien pour plus d’informations.

0
Satyavrat

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

apply plugin: 'com.Android.application'

Android {
compileSdkVersion 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
    compile 'com.Android.support:support-v4:23.0.1'
    compile 'com.Android.support:appcompat-v7:23.0.1'
    compile 'com.Android.support:design:23.0.1'
    compile 'com.google.Android.gms:play-services:+'

    compile 'com.Android.support:multidex:1.0.1'

}
0
user2759839