com.android.dex.DexException: Multiple dex files define 意思是:出现了多个dex文件定义的异常。

29

我正在使用Android Studio 0.4.2。从一个使用0.3.2版本的朋友那里打开项目。尝试编译但出现了异常。

Execution failed for task ':JuiceTV:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Program Files\Android\android-studio\sdk\build-tools\19.0.0\dx.bat --dex --output D:\Antik TV - Android\JuiceTV\build\libs\JuiceTV-debug.dex D:\Antik TV - Android\JuiceTV\build\classes\debug D:\Antik TV - Android\JuiceTV\build\dependency-cache\debug D:\Antik TV - Android\JuiceTV\build\pre-dexed\debug\classes-ffe9228b675e120536184b1056a59fcfc91e4006.jar D:\Antik TV - Android\JuiceTV\build\pre-dexed\debug\commons-io-2.4-27f1277ba9e42db4b52f3f658da01a26db29b896.jar D:\Antik TV - Android\JuiceTV\build\pre-dexed\debug\joda-time-2.2-4549e2440d188ee3fb4f85702e03eace13e8ad18.jar D:\Antik TV - Android\JuiceTV\build\pre-dexed\debug\mmlib-04a4fd100008bfbc84f0c25fd219e50eb7de9d0b.jar D:\Antik TV - Android\JuiceTV\build\pre-dexed\debug\support-v4-18.0.0-ba816fc3ae00ee0fdb20e5444c1d8bb88647d773.jar
Error Code:
    2
Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Lcom/sevensoft/mmlib/AttachedOverlayWindow$1;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:593)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:551)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:532)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:169)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:187)
        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)  

尝试过以下事项:

  • 删除 *.apk 文件
  • 使用 gradle -q dependencies 命令搜索依赖,但没有找到任何内容

JuiceTV Gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 18
    }
}

dependencies {
    compile project(':TVbase')
}

BaseTv Gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.+'
    }
}
apply plugin: 'android-library'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion '19.0.0'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 18
    }
}

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile files('libs/joda-time-2.2.jar')
    compile files('libs/mmlib.jar')
    compile files('libs/commons-io-2.4.jar')
}

有什么新的提示吗?


8
尝试这样做:从“Build > Clean Project”清理您的项目,然后使用“File > Inavlidate Cache/Restart”。 - Piyush Agarwal
你能告诉我在 Eclipse 中我可以做同样的事情吗? - Sonny
在我的情况下,./gradlew clean 是可行的,而不是 ./gradlew android:clean - Tinmarino
5个回答

18

我刚遇到了同样的问题,发现我的应用程序和一个库引用了同一个jar包的两个不同版本。

我进行了搜索,发现我的application.iml文件清楚地显示了这些重复项。

<orderEntry type="library" exported="" name="crittercism_v3_0_11_sdkonly" level="project" />
<orderEntry type="library" exported="" name="crittercism_v4_4_0" level="project" />

我用新的v4版本替换了旧的v3版本,在进行一次干净的重建之后它正常运行了。


9
你是如何进行这次搜索的? - E.A.T
如果这些依赖关系来自第三方库,您可以在build.gradle中声明相同且最新的库,或通过排除语句从库中删除旧版本。 - Bresiu
1
我使用Gradle中的依赖图解决了我的问题。使用Gradle包装器运行./gradlew dependencies以查看图形,然后进行搜索。请记住,根据项目结构,您可能需要运行./gradlew app:dependencies或./gradlew lib:dependencies。 - Henrik Gyllensvärd

7

当一个模块同时依赖于另一个模块和该模块的jar包时,就会出现这种情况。


我遇到了同样的问题。最初,我将一个项目作为aar依赖添加进来,然后当我将同一个项目作为直接模块添加时,我忘记移除aar依赖。 - lujop

2
自 Android Gradle 1.0 起,可能会出现以下几种情况:
  1. 如果您只使用 Maven 存储库,则可能会遇到此问题,如果两个不同的构件包含相同的类文件
    例如,Mockito-all 库包括 Hamcrest,因此如果在构建中同时包含这两个依赖项,则会导致此错误。
    请注意,如果您已打开缩小功能,则直到开始使用 Hamcrest 才会看到该错误。解决此问题的方法是使用不包含其他包的类的库版本(在本例中为 Mockito-core)。

  2. 如果声明了一个本地 jar/aar 依赖项(compile 'com.some.library:some-artiface-version_number@aar'),而该依赖项已经被其他基于 Maven 的依赖项包含
    在这种情况下,由于 pom 信息不可用,因此您的本地声明不会与 Maven 声明进行去重。通常,您需要为 aar 创建一个基于文件的本地 maven 存储库以解决这个问题。

无论哪种情况,都需要进行一次项目清理才能更新更改。


2

我在使用Android Studio 1.0时遇到了这个问题,除了删除库的重复条目之外,您还应该尝试删除bin文件夹并进行清理构建。


1
禁用 multiDex 并启用 dexOptions 中的增量编译也会导致此问题。
defaultConfig {
    multiDexEnabled = false
 }
dexOptions {
    javaMaxHeapSize "4g"
    incremental true
}

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