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
UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define
提问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 结构:
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.gradle
for “app”
, I have:
在build.gradle
for里面“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.gradle
for gene_test_library
, I have nothing:
在build.gradle
for里面gene_test_library
,我什么都没有:
dependencies {
}
Inside build.gradle
for gene_nine_old_androids_library
, I have:
在里面build.gradle
for gene_nine_old_androids_library
,我有:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.0'
}
Inside build.gradle
for swipe_list_view_library
, I have:
在里面build.gradle
for 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.gradle
for 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:”
错误。这是为什么?
Well, writing //compile project(':libraries:genes_nine_old_androids_library')
inside the build.gradle
for “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.gradle
for “app” module becomes:
好吧,//compile project(':libraries:genes_nine_old_androids_library')
在build.gradle
for 中写入“app”
,与获取“genes_nine_old_androids_library”
模块的构建依赖项并将其放在那里相同。因此取消注释该//compile project(':libraries:genes_nine_old_androids_library')
语句,build.gradle
for “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 解决了问题