意外的顶级异常:com.android.dex.DexException:多个dex文件定义

45

当我在Android项目中添加Google Analytics的配置并构建项目时,出现以下错误:

: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

这是什么意思,我该如何避免这个错误?


这可能是一个构建路径问题。https://dev59.com/mGsz5IYBdhLWcg3wNE5q - Stephen C
2
@confile:如果Gradle中没有,请添加此依赖项-> compile 'com.android.support:multidex:1.0.0'。 - AndiGeeky
@AndiGeeky 在顶层或应用程序项目中的哪里? - Michael
1
@cnfile: “App项目”,在这里您定义了所有的依赖项..!! - AndiGeeky
13个回答

97

可能有点晚了,但这很可能是您在应用程序的build.gradle文件中列出的依赖项存在问题。

经过大量测试,我成功地找到了我的问题,并相信它可能对其他人有所帮助。

不建议的事情:

除非您绝对需要在build.gradle中启用multiDex,否则不要这样做,这只是跨越您应用程序中潜在问题的表面,而没有解决根本问题。您还会不必要地增加apk的大小,并且当dex文件中存在冲突方法时,可能会发生意外崩溃。

需要注意的事情:

检查您在build.gradle文件中的所有依赖项。您是否引用了已经包含在其他依赖项中的依赖项?例如,如果您包括appcompat-v7,则无需包括appcompat-v4,因为v7包含来自v4的所有功能。

我实际上发现的问题(导致我的应用程序超过dex文件中的方法限制)----> GOOGLE PLAY SERVICES

如果您不需要所有Google Play服务库依赖项,请远离在您的build.gradle中使用此行:compile 'com.google.android.gms:play-services:8.3.0',而只使用您需要的内容!

Google有一个全面的库列表,可以选择性地进行编译这里

总之,您可能只需要在gradle中包含此一行以获取您的Google Analytics:

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

编辑

同时,在您的项目根目录下(或使用Android Studio终端),运行以下命令可以查看依赖树:

./gradlew app:dependencies

祝你好运,愉快编码!

更新

现在在Android Studio 2.2中,您不再需要尝试和错误地确定是否需要在应用程序中使用multi-dex。使用Apk Analyzer查看是否真的需要它!


2
只添加必要的Google服务API就可以了!谢谢。 - Anil Muppalla
1
只添加必要的Google服务API对我也起作用了。非常感谢。 - Arash Khoeini
1
在我的情况下,我使用了不必要的 Twitter 库。非常感谢。 - Abdul Waheed
太棒了!这对我有用,让我更加意识到我正在编译和实际使用什么。 - ThePartyTurtle
我在哪里可以找到适用于谷歌播放消息的那个?因为我遇到了同样的问题,但我不需要分析。 - user3432681
@user3432681,您可以使用上面标记为“here”的链接查看来自Google Play服务的所有API。 - kandroidj

13

说明:使用超过 65K 方法的应用构建

Android 应用程序 (APK) 文件包含 Dalvik Executable (DEX) 文件的可执行字节码文件,其中包含编译代码以运行您的应用程序。Dalvik Executable 规范限制了单个 DEX 文件中可以引用的方法总数为 65,536,包括 Android 框架方法、库方法和自己代码中的方法。要超越此限制,需要配置您的应用程序构建过程以生成多个 DEX 文件,称为 multidex 配置。

注意:这样可以使您引用应用程序的所有方法。这就像您有两个模块(限制:2 x 65K),但压缩成一个。这会在构建过程中产生时间成本。

解决方案:

  1. 您应该尝试使用库格式化代码以删除多余的类,并且不超过方法限制。例如,如果您使用 maps play-services ( com.google.android.gms: play-services: 8.1.0),则可以更改为 (compile 'com.google.android.gms:play-services-maps:8.1.0') 来消除不必要的库依赖项。然后在 AndroidStudio 中同步 Gradle 并检查是否运行。 如果未运行,请转到第2点。
  2. build.gradle (应用程序模块) 中添加以下代码。
android {
   ...
   defaultConfig {
      ...
      multiDexEnabled true
   }
}

1
我认为你的问题是超过了65k的限制。例如,如果你使用maps play-services(com.google.android.gms:play-services:8.1.0),你可以改成(compile 'com.google.android.gms:play-services-maps:8.1.0')来消除不必要的库依赖。 - SergioLucas
我已经做了这个,但错误仍然存在。我们还能做些什么? - Saket Jain

5

对我来说,这与retrofit 2的simplexml转换器有关。 解决方法是:

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


3
Android 5.0及更高版本的多Dex支持
Android 5.0及更高版本使用名为ART的运行时,该运行时本地支持从应用程序APK文件中加载多个dex文件。ART在应用程序安装时执行预编译,扫描classes(..N).dex文件并将它们编译成一个单独的.oat文件,供Android设备执行。有关Android 5.0运行时的更多信息,请参见Introducing ART。
这意味着您的应用程序在API级别21或更高级别上可以正常工作。
Android 5.0之前的多Dex支持
Android 5.0之前的平台版本使用Dalvik运行时来执行应用程序代码。默认情况下,Dalvik将应用程序限制为每个APK一个classes.dex字节码文件。为了克服这个限制,您可以使用多Dex支持库,该库成为您的应用程序的主要DEX文件的一部分,然后管理对附加DEX文件及其包含的代码的访问。
因此,首先确保您已导入正确的依赖项,看起来您已经做到了。
dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

在你的清单文件中,将多 dex 支持库中的 MultiDexApplication 类添加到应用程序元素中。
<?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>

作为替代方案,如果您的应用程序扩展了Application类,则可以重写attachBaseContext()方法并调用MultiDex.install(this)来启用multidex
   @Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

最后,您需要更新您的 build.gradle 文件,将 multiDexEnabled true 添加如下:
defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  

我希望它能帮助到你。

2
你提到了“attachBaseContext”,但在你的示例中使用了“onCreate”。根据此文档:https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html,应该使用“attachBaseContext”。 - Michael

2

我遇到了完全相同的问题!

我发现这是由于重复依赖引起的。在build.gradle中,一个依赖项可能已经被其他依赖项包含,从而产生冲突。我删除了必要的依赖项并解决了我的问题。


1
请不要使用回答来说“我也是”。已经接受的答案已经说明了重复依赖项会导致问题。 - OneCricketeer

2

在我的情况下,build.gradle文件中出现了两次这个问题。

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

当我删除第二个条目后,它就正常工作了。


在我的情况下,我有一个额外的“com.google.android.gms:play-services:8.4.0”,这是我尝试过的某些东西的剩余物。感谢这个评论指引我朝着正确的方向。 - lazyguy

1
我所做的是从这里(https://developers.google.com/analytics/devguides/collection/android/v4/)中删除gradle更改,然后在Android Studio中进入“文件/项目结构”,点击 "analytics",如果复选框被选中,请取消选中,让gradle进行同步,然后再次选中该框并单击登录按钮。完成所有操作后,您只需将实际的跟踪器ID复制到mTracker = analytics.newTracker(<here>), 如果需要帮助,请查看此页面https://developers.google.com/android/reference/com/google/android/gms/analytics/GoogleAnalytics.

1
在构建文件中包含特定依赖项。

如果您想将地图添加到您的应用中,那么请包含编译'com.google.android.gms:play-services-location:9.2.1'


代替编译 'com.google.android.gms:play-services:9.2.1'

0

0

相同的问题,但是使用react-native-svg时。这个帮助了我:

cd android
./gradlew clean

源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接