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

Posted

技术标签:

【中文标题】意外的***异常:com.android.dex.DexException:多个 dex 文件定义【英文标题】:UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define 【发布时间】:2015-12-24 06:26:09 【问题描述】:

当我将 google analytics 的配置添加到我的 android 项目并构建项目时,我收到以下错误:

: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

这是什么意思,如何防止出现此错误?

【问题讨论】:

这可能是构建路径问题。 ***.com/questions/8059719/… @confile : 如果不在 gradle 中,请添加此依赖项 -> compile 'com.android.support:multidex:1.0.0' @AndiGeeky 顶层或应用项目在哪里? @cnfile : "App project" 你定义了所有依赖项..!! 【参考方案1】:

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

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

我不推荐的东西:

除非您绝对需要在 build.gradle 中启用 multiDex到它的根源。您还不必要地增加了 apk 的大小,当您的 dex 文件中存在冲突的方法时,可能会出现意外崩溃。

注意事项:

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

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

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

Google 有一个完整的库列表,用于选择性地编译 here

话虽如此,您可能只需要在 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 看看它是否真的需要!

【讨论】:

只添加必要的谷歌服务 API 有效!谢谢。 只添加必要的谷歌服务 api 也对我有用。非常感谢。 就我而言,我使用了不必要的 Twitter 库。非常感谢 太棒了!这对我有用,让我更加了解我正在编译和实际使用的内容。 我在哪里可以找到用于 google play 消息的那个。因为我有同样的问题。但我不需要分析。【参考方案2】:

说明: Building Apps with Over 65K Methods

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

注意: 这允许您引用应用程序的所有方法。就好像您有两个模块(限制:2 x 65K)但压缩为一个。这需要构建过程中的成本(时间)。

解决方案:

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

【讨论】:

我认为您的问题是您通过了 65k 限制。例如,如果您使用地图播放服务 (com.google.android.gms: play-services: 8.1.0),则可以更改为 (compile 'com.google.android.gms:play-services-maps:8.1. 0') 消除不必要的库依赖 我已经这样做了,但错误仍然存​​在。我们还能做什么?【参考方案3】:

对我来说,它与改造 2 的 simplexml 转换器有关。它由以下人员修复:

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

【讨论】:

【参考方案4】:

对 Android 5.0 及更高版本的 Multidex 支持

Android 5.0 及更高版本使用一个名为 ART 的运行时,它本机 支持从应用 APK 文件中加载多个 dex 文件。艺术 在应用程序安装时执行预编译,扫描 classes(..N).dex 文件并将它们编译成单个 .oat 文件 由安卓设备执行。有关 Android 的更多信息 5.0 运行时,请参阅 ART 简介。

这意味着您的应用可以在 API 级别 21 或更高级别上正常运行。

Android 5.0 之前的 Multidex 支持

Android 5.0 之前的平台版本使用 Dalvik 运行时 用于执行应用程序代码。默认情况下,Dalvik 将应用程序限制为单个 每个 APK 的 classes.dex 字节码文件。为了解决这个问题 限制,你可以使用multidex支持库,它变成 应用程序的主要 DEX 文件的一部分,然后管理对 额外的 DEX 文件及其包含的代码。

所以,首先确保你已经导入了正确的依赖,看起来你已经做到了。

dependencies 
  compile 'com.android.support:multidex:1.0.1'

在您的清单中,将 multidex 支持库中的 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);

最后,您需要通过添加multiDexEnabled true 来更新您的 build.gradle 文件:

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

希望对你有所帮助。

【讨论】:

你写了关于attachBaseContext,但在你的例子中你确实使用了onCreate。据此:developer.android.com/reference/android/support/multidex/… 一定是attachBaseContext【参考方案5】:

在我的例子中,我在 build.grade 文件中有两次

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

一旦我删除了第二个条目,它就可以正常工作了。

【讨论】:

在我的情况下,我有一个额外的 'com.google.android.gms:play-services:8.4.0',这是我正在尝试的东西留下的。感谢这条评论为我指明了正确的方向。【参考方案6】:

跟我遇到的问题一模一样!

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

【讨论】:

请不要用答案说“我也是”。接受的答案已经说过重复的依赖关系会导致问题。【参考方案7】:

我为解决此问题所做的工作是从此处 (https://developers.google.com/analytics/devguides/collection/android/v4/) 中删除 gradle 更改,然后在 Android Studio 中进入“文件/项目结构”,然后单击分析,如果选中该框,请取消选中它,然后让 gradle 同步再次选中该框并单击按钮登录。毕竟要让您的分析跟踪器正常工作,您只需将您的实际跟踪器 ID 复制到 mTracker = analytics.newTracker(&lt;here&gt;) 查看此页面以获取帮助。 https://developers.google.com/android/reference/com/google/android/gms/analytics/GoogleAnalytics

【讨论】:

【参考方案8】:

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

如果您想将地图添加到您的应用程序中,则 include 编译 'com.google.android.gms:play-services-location:9.2.1'


而不是编译'com.google.android.gms:play-services:9.2.1'

【讨论】:

【参考方案9】:

我认为您正在使用 google analytic sdk V3 使用 V4 而不是我在使用 google analytic https://developers.google.com/analytics/devguides/collection/android/v4/ 的 sdk V3 时也遇到了同样的问题,请参阅此链接了解更多信息。

【讨论】:

【参考方案10】:

如果您将 Android Studio 更新到最新版本 1.4,可能会发生这种情况。您是否将支持库更新到最新版本?你的compileSdkVersion 应该是 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'


【讨论】:

【参考方案11】:

实际上,我发现在未启用 multidex 的情况下,Android Studio 模块过多会导致出现此错误。如果您试图避免启用 multidex,则限制似乎在 26 个模块左右。这是使用 Android Studio 1.5.1

【讨论】:

【参考方案12】:

同样的问题,但在使用 react-native-svg 时。这对我有帮助:

cd android
./gradlew clean

Source

【讨论】:

【参考方案13】:

来自 Android 开发者网站:

Android 5.0(API 级别 21)及更高版本使用称为 ART 的运行时,它天真地支持从 APK 文件加载多个 DEX 文件。

我已将 min SDK 设置为 21,它为我解决了这个问题(当然,如果您可以将 min-SDK 设置为 21 或更高,您需要检查您的具体情况)

【讨论】:

以上是关于意外的***异常:com.android.dex.DexException:多个 dex 文件定义的主要内容,如果未能解决你的问题,请参考以下文章

Android Bug:Error:com.android.dex.DexException: Multiple dex files define Landroid/support/design/wi

如何修复将字节码转换为 dex 的错误原因:com.android.dex.DexException:多个 dex 文件定义 Lorg/apache/http/conn/ssl/AbstractVer

Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files defi

As Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Mult

Error:Error converting bytecode to dex:Cause: com.android.dex.DexException: Multiple dex files defin

Error:Error converting bytecode to dex:Cause: com.android.dex.DexException: Multiple dex files defin