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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22468700/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 15:55:20  来源:igfitidea点击:

UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define

javaandroidandroid-studiogoogle-play-services

提问by Josué H.

I have a trouble trying use a Google Play Services on my Android App using Android Studio.

我在尝试使用 Android Studio 在我的 Android 应用程序上使用 Google Play 服务时遇到问题。

I've tried everything and still doesn't work.

我已经尝试了一切,但仍然无法正常工作。

This is the error.

这是错误。

Execution failed for task ':app:dexDebug'.

com.android.ide.common.internal.LoggedErrorException: Failed to run command: /Users/jghg/Desktop/My App/Android/SDK/android-sdk-mac_86/build-tools/19.0.1/dx --dex --output /Users/jghg/Desktop/My App/Eureka/UDA/app/build/libs/app-debug.dex /Users/jghg/Desktop/My App/Eureka/UDA/app/build/classes/debug /Users/jghg/Desktop/My App/Eureka/UDA/app/build/dependency-cache/debug /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/classes-08979151dd1373bd3f799299d93376d22d4afa46.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/classes-167b9d3c5d689abe004c3fa5b0bcb945d3f0fc8e.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/google-play-services-ec20f8af7bb457c5095cae1afa0cee722582f198.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/support-v4-13.0.0-473d85b8d55c88bfed3404072e6c132f96543429.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/support-v4-19.0.1-861cc05365a0e9262c764da37d61e3f93dc16de6.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/support-v4-19.0.1-dcc11377c764caea791f711123b8b678f876c3b6.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/twitter4j-async-3.0.5-0904cb320186fb23a9a9bf25a048c5bc4ec07bc2.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/twitter4j-core-3.0.5-41d2d5805e2d90cf77813a126306c4cbe22583ae.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/twitter4j-examples-3.0.5-adc1ee9b037c8061429560e6a5fe89ce8e502db6.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/twitter4j-media-support-3.0.5-37d138cdc631738d13ddb6f4d34c560a9cd8e048.jar /Users/jghg/Desktop/My App/Eureka/UDA/app/build/pre-dexed/debug/twitter4j-stream-3.0.5-c96c138ea216b25631a1a8b47520ecaf33f288d8.jar Error Code: 2 Output: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Lcom/google/ads/AdRequest$ErrorCode; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170) at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) at com.android.dx.command.dexer.Main.run(Main.java:230) at com.android.dx.command.dexer.Main.main(Main.java:199) at com.android.dx.command.Main.main(Main.java:103)

jar /Users/jghg/Desktop/我的应用程序/Eureka/UDA/app/build/pre-dexed/debug/twitter4j-stream-3.0.5-c96c138ea216b25631a1a8b47520ecaf33f288d8.jar 错误代码:2 输出:EXTOPEXTIONPEC android.dex.DexException:多个 dex 文件定义了 Lcom/google/ads/AdRequest$ErrorCode;在 com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594) 在 com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552) 在 com.android.dx.merge.DexMerger.mergeClassDefs (DexMerger.java:533) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170) at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) at com.android。 dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) 在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:

Thanks. Best Regards.

谢谢。此致。

采纳答案by Gene

The error occurs when you have the same library/directory included more than once in your build.gradle's dependencies. Ok, let's say you have an App structure that looks like this:

当您在 build.gradle 的依赖项中多次包含相同的库/目录时会发生错误。好的,假设您有一个如下所示的 App 结构:

enter image description here

在此处输入图片说明

So you have the main “app” and then you have a bunch of sub-apps/modules/libraries. The libraries are: 1) gene_test_library, 2) genes_nine_old_androids_library, & 3) swipe_list_view_library.

所以你有主“应用程序”,然后你有一堆子应用程序/模块/库。这些库是: 1) gene_test_library, 2) genes_nine_old_androids_library, & 3) swipe_list_view_library

My name is Gene, so that's why there are all these “gene” libraries.

我的名字是 Gene,这就是为什么有所有这些“基因”库的原因。

Inside the build.gradlefor “app”, I have:

build.gradlefor里面“app”,我有:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.0'

    compile project(':libraries:gene_test_library')
    //compile project(':libraries:genes_nine_old_androids_library')
    compile project(':libraries:swipe_list_view_library')
}

Inside the build.gradlefor gene_test_library, I have nothing:

build.gradlefor里面gene_test_library,我什么都没有:

dependencies {
}

Inside build.gradlefor gene_nine_old_androids_library, I have:

在里面build.gradlefor gene_nine_old_androids_library,我有:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

Inside build.gradlefor swipe_list_view_library, I have:

在里面build.gradlefor swipe_list_view_library,我有:

dependencies {
    compile 'com.nineoldandroids:library:2.4.0+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

This line of code compile fileTree(dir: 'libs', include: ['*.jar'])just means “hey, look inside the ‘libs' folder inside this module for any jar files. I do not have anything in the libs folder of any of the modules so you can ignore that line of code.

这行代码的compile fileTree(dir: 'libs', include: ['*.jar'])意思是“嘿,在这个模块内的‘libs’文件夹中查找任何 jar 文件。我在任何模块的 libs 文件夹中都没有任何内容,因此您可以忽略该行代码。

So let's say I uncomment out //compile project(':libraries:genes_nine_old_androids_library')In the build.gradlefor the “app”module. Then I would get the “UNEXPECTED TOP-LEVEL EXCEPTION:”error. Why is that?

所以我们可以说我取消了//compile project(':libraries:genes_nine_old_androids_library')build.gradle“app”模块。然后我会得到“UNEXPECTED TOP-LEVEL EXCEPTION:”错误。这是为什么?

enter image description here

在此处输入图片说明

Well, writing //compile project(':libraries:genes_nine_old_androids_library')inside the build.gradlefor “app”, is the same as taking the build dependencies of “genes_nine_old_androids_library”module and putting it there. So uncommenting the //compile project(':libraries:genes_nine_old_androids_library')statement, the build.gradlefor “app” module becomes:

好吧,//compile project(':libraries:genes_nine_old_androids_library')build.gradlefor 中写入“app”,与获取“genes_nine_old_androids_library”模块的构建依赖项并将其放在那里相同。因此取消注释该//compile project(':libraries:genes_nine_old_androids_library')语句,build.gradlefor “app”模块变为:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.0'

    compile project(':libraries:gene_test_library')
    ***compile fileTree(dir: 'libs', include: ['*.jar'])***
    ***compile 'com.android.support:appcompat-v7:21.0.0'***
    compile project(':libraries:swipe_list_view_library')
}

Notice how now compile 'com.android.support:appcompat-v7:21.0.0'shows up 2x. That's where the error is coming from.

请注意现在如何compile 'com.android.support:appcompat-v7:21.0.0'显示 2 倍。这就是错误的来源。

回答by iTapAndroid

Your google play services library is being exported from other dependencies of your project and at the compile time the dex compiler gets confused.

您的 google play 服务库正在从您项目的其他依赖项中导出,并且在编译时 dex 编译器会感到困惑。

If you're using Gradle then including this in your project's build.gradle should exclude the support library from being exported into your main project.

如果您使用的是 Gradle,那么将它包含在您项目的 build.gradle 中应该会排除支持库被导出到您的主项目中。

apply plugin: 'android'
apply plugin: 'crashlytics'

/** Must exclude exported support jars from dependencies, or get dex duplicate class      error.
*  we're
**/
configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
    all*.exclude group: 'com.google.android.gms', module: 'play-services'
}

If you're using the andoid studio build system. Then you should go to File -> project structure and disable -> modules. Go through each module the and click on the dependency tab, uncheck the export column for for the support library and google play services library.

如果您使用的是 andoid studio 构建系统。然后你应该去文件 -> 项目结构并禁用 -> 模块。浏览每个模块并单击依赖项选项卡,取消选中支持库和 google play 服务库的导出列。

Post comments if you need more help.

如果您需要更多帮助,请发表评论。

回答by kip2

It could also happen if you have differing versions of the same library imported in your build.gradle vs one in one of your libraries. For example, Google Play Store services requires you have them all refer to the same version I had:

如果您在 build.gradle 中导入了相同库的不同版本,而在您的某个库中导入了不同版本,也可能会发生这种情况。例如,Google Play 商店服务要求您将它们都指向我拥有的相同版本:

app build.gradle

应用程序构建.gradle

compile 'com.google.android.gms:play-services-base:7.5.0'

compile 'com.google.android.gms:play-services-base:7.5.0'

whereas:

然而:

module/library build.gradle

模块/库 build.gradle

compile 'com.google.android.gms:play-services-cast:7.8.+'

compile 'com.google.android.gms:play-services-cast:7.8.+'

Upgrading my app's version to 7.8.0 solved the problem

将我的应用程序版本升级到 7.8.0 解决了问题