无法合并 Dex - Android Studio 3.0

41

当我将我的 Android Studio 更新到 3.0 版本并在稳定通道上运行项目时,我开始遇到以下错误。

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

我尝试清理并重建该项目,但没有成功。欢迎提供任何帮助。

项目级别的build.gradle文件

buildscript {
repositories {
    jcenter()
    google()
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.0.0'
    classpath 'com.google.gms:google-services:3.1.0'


    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
} 
allprojects {
repositories {
    jcenter()
    google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

应用级别的 build.gradle

apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
    applicationId "com.med.app"
    minSdkVersion 21
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    resConfigs "auto"
    multiDexEnabled true

}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})

compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'

//appcompat libraries
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support:design:26.1.0'


//butterknife
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

//picasso
compile 'com.squareup.picasso:picasso:2.5.2'

//material edittext
compile 'com.rengwuxian.materialedittext:library:2.1.4'

// Retrofit & OkHttp & and OkHttpInterceptor & gson
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'

// FirebaseUI for Firebase Auth
compile 'com.firebaseui:firebase-ui-auth:3.1.0'
}
apply plugin: 'com.google.gms.google-services'

我已经尝试了所有给出的答案,但无法解决这个错误。请帮帮我。


1
@IntelliJAmiya,我也尝试了你链接的那个问题的解决方案。但是它们都没有起作用。 - user8583580
@NirajSanghani 我也尝试启用multidex,但没有帮助。 - user8583580
你可以尝试将google()存储库放在buildscript存储库中。 - Niraj Sanghani
尝试使用详细选项构建Gradle。在我的情况下,我发现问题出在/libs中的一个库上。我将其删除后,问题得到解决。 - cxphong
请问您能否将完整的 build.gradle 文件粘贴在这里。 - Bhavesh Patadiya
显示剩余14条评论
22个回答

29

在您的firebase-ui-auth依赖项中添加一个显式依赖于play-services-auth

// FirebaseUI for Firebase Auth
    compile 'com.firebaseui:firebase-ui-auth:3.1.0'
    compile 'com.google.android.gms:play-services-auth:11.4.2'

这是因为firebase-ui-auth具有对play-services-auth的传递依赖关系,并且必须与相应版本的play-services-auth一起使用。请参见此说明

firebase-ui-auth
|--- com.google.firebase:firebase-auth
|--- com.google.android.gms:play-services-auth

早期版本的Gradle构建工具不包括传递依赖项,因此现在的版本可能会与其他play-services版本发生冲突。

我的问题已解释并得到答复(如果有人想知道)

当您升级到Android Studio 3.0并将gradle构建工具版本更新为3.0.0时,依赖项的编译方式与早期版本不同。

我最近遇到了同样的问题。 我使用这些依赖项,这在Gradle版本2.3.3中运行良好:

implementation 'org.apache.httpcomponents:httpmime:4.3.6'
implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'

升级到gradle-build-version 3.0.0后,我遇到了相同的错误。仔细分析后,我发现httpmime的传递依赖与包含文件httpclient-android存在冲突。

描述

让我详细解释一下。早些时候,当我使用gradle-tool-version 2.3.3时,我正在使用httpclient-android来获取并使用名为org.apache.http.entity.ContentType.java的类。扩展org.apache.httpcomponents:httpmime:4.3.6的传递依赖后,显示它具有org.apache.httpcomponents:httpcore:4.3.6,这是我想要使用的相同软件包。但在编译或同步构建时,将排除org.apache.http.entity.ContentType.java,因此我需要添加此依赖项,其中包括ContentType.java

implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'

之后一切都正常了。

当我将gradle-build-version升级到3.0.0后,情况就变了。它现在包含了所有传递依赖项。因此,在使用gradle-build-tool版本3.0.0的最新Android Studio编译时,我的ContentType.java会被编译两次。一次来自httpmime的隐式传递依赖项org.apache.httpcomponents:httpcore:4.3.6,另一次来自我之前使用的org.apache.httpcomponents:httpclient-android:4.3.5.1

为了解决这个问题,我不得不删除现有的org.apache.httpcomponents:httpclient-android:4.3.5.1依赖项,因为httpmime将会自己获取所需的应用程序类。

我情况下的解决方案:仅使用所需的依赖项并删除httpclient-android

implementation 'org.apache.httpcomponents:httpmime:4.3.6'

请注意这仅适用于我个人的情况。您需要深入了解自己的依赖关系,并相应地应用解决方案。


没错,我也遇到了类似的问题。我的一个项目依赖及其传递依赖库都依赖于“com.android.volley”。因此,这个新的Gradle在合并dex文件时出现了问题。我通过在我的gradle文件中添加“exclude group: 'com.android.volley'”来解决它。 - Harish Rana
@Bhavesh Patadiya,请在这里帮助我(https://stackoverflow.com/questions/46976279/dexarchivemergerexception-unable-to-merge-dex)。我陷入了困境,无法解决它。 - Pardeep Sharma
真幸运,您的解释恰好与 org.apache.httpcomponents:httpclient-android 和 org.apache.httpcomponents:httpmime 相关。我一直在疯狂地寻找它们。谢谢! - xarlymg89
4
你需要深入研究你遇到问题的那些类。但是你如何找出你遇到问题的那些类呢?你是否运行了 ./gradlew dependencies 并检查所有传递依赖(在输出中标记为 xxx -> yyy)? - Denys Kniazhev-Support Ukraine

14

首先,我按照先前的评论建议启用了multidex。

然后,如果错误仍然存在,请打开Gradle控制台(点击“消息”部分左侧的“显示控制台输出”图标),并点击链接以使用Debug / Info / Stack选项重新编译。 这将显示有关错误的更多详细信息。

在我的情况下,“Unable to merge dex”错误是由“com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0”中重复条目引起的。

我手动从我的项目中删除了冲突库,并执行了“Rebuild Project”(强制重新加载库)。这解决了问题。


1
你具体在哪里看到了重复的条目?在build.gradle文件中吗?还是在文件夹中的实际jar包里?谢谢。 - Russ Wheeler
我遇到了“com.android.dex.DexIndexOverflowException”错误,尽管我已经启用了multidex,并且在更新到Android Gradle插件3.0之前我的项目构建得很好。 - AutonomousApps
我按照所述步骤进行操作,但出现了以下错误:Caused by: com.android.dex.DexException: Multiple dex files define Lcom/google/firebase/iid/zzd; 我尝试删除 FirebaseUI 库、重建项目并再次添加依赖项,但仍无法解决问题。 - user8583580
Eres una pistola - dan_flo10
用了很长时间才确定和消除重复依赖项(我觉得 Gradle 应该自动完成此操作),但是使用 stack info 重新编译(显示哪个类被复制)是我需要修复它的工具。 - Erhannis

3

如果您在使用2个或更多同名但版本不同的库,请检查您的 build.gradle (app) 中的依赖关系。例如(以我的情况为例):

implementation files('src/main/libs/support-v4-24.1.1.jar')
implementation 'com.android.support:support-v4:27.0.2'

移除其中一个,然后进行清理和重建。同时注意依赖项buildscript之外。


3

我遇到了这个错误:

com.android.builder.dexing.DexArchiveMergerException: 无法合并dex

最终我改回了我的gradle文件以解决这个问题。

app\build.gradle

android {
compileSdkVersion 25
//buildToolsVersion '26.0.2'
buildToolsVersion '25.0.3'//<< Changed back to old version before my studio 3.0 update
defaultConfig { ....

.\build.gradle

buildscript {
repositories {
    jcenter()
    google()
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3' //<< Changed back to old version before my studio 3.0 update
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

这不是最理想的方案,因为它是回溯的,但对我来说有效,应该可以帮我解决问题,直到可能发布补丁。


2
有时候,当同一个 .jar 库文件同时存在于“libs”文件夹中,并且我们尝试通过在应用 gradle 文件中添加“compile”行来获取源代码时,就会出现此错误。
如果我们删除其中任何一个,就可以克服这个错误。
希望这对您有所帮助。

2
android {
    defaultConfig {
       multiDexEnabled true
    }
}

:gradle文件中添加此行


3
虽然这段代码可能回答了问题,但提供有关如何为什么解决问题的额外上下文会提高答案的长期价值。 - Alexander

1

只需将您的类路径更改为:

classpath 'com.android.tools.build:gradle:2.3.3'

并同步您的Gradle。

希望这可以帮助您。


1
虽然这可能回答了问题,但最好解释答案的基本部分,并可能解释OP代码中的问题。 - pirho

1

"所有GSM库" 谢谢,它帮助我解决了问题,但不仅是GSM库,所有Google库必须具有相同的版本。 我遇到了dexing错误,因为com.android.support:recyclerview-v7与com.android.support:appcompat-v7版本不同。

Android Studio在build.gradle文件中显示这些带红色下划线的行。


1
我有同样的问题,我解决了它,放置了以下内容:

classpath 'com.google.gms:google-services:3.0.0'

在 buildscript -> dependencies 中。

build.gradle

在我的文件中,我有以下内容:
buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

0

这可能已经太晚了,但是我认为我也有一个答案。根据我的最近尝试,在编译应用程序时,请确保在同一项目中没有相同包的 jar 文件和'implementation'('compile' for 3.0.1 > gradle)。在我的情况下,我在同一个项目中有implementation 'org.jsoup:jsoup:1.11.2'Jsoup jar。这是新手错误,但是我学到了。


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