无法合并dex


307

我有Android Studio Beta。我用旧模块编译了一个新项目,但是当我尝试启动该应用程序时,它并没有显示以下消息:

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.

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

但是我不知道如何解决这个错误。我用谷歌搜索了几个小时,但没有成功。

我的项目gradle:

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta6'
        classpath "io.realm:realm-gradle-plugin:3.7.1"
        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
}

我的应用程式gradle:

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId "parad0x.sk.onlyforyou"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
        }
    }
    compileOptions {
        targetCompatibility 1.7
        sourceCompatibility 1.7
    }
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
    lintOptions {
        checkReleaseBuilds false
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    //noinspection GradleCompatible
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
    compile project(path: ':loginregisterview')


}

和我的模块gradle:

    apply plugin: 'com.android.library'
apply plugin: 'realm-android'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    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:appcompat-v7:26.0.2'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'com.github.bumptech.glide:glide:4.0.0'
    testCompile 'junit:junit:4.12'
    compile project(path: ':parser')

}

我的第二个模块:

     apply plugin: 'com.android.library'
apply plugin: 'realm-android'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    realm {
        syncEnabled = true
    }
    useLibrary 'org.apache.http.legacy'

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile 'junit:junit:4.12'
    //  compile 'com.android.support:appcompat-v7:23.1.0'

    //   compile 'com.fasterxml.jackson.core:jackson-core:2.9.0'
 //   compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.0'
 //   compile 'com.fasterxml.jackson.core:jackson-databind:2.9.0'
    compile 'com.google.code.gson:gson:2.6.2'
}

____________发现_________

当我不导入第二个模块(解析器)时,该应用程序在dex上没有崩溃,但是当该模块未导入时,应用程序无法正常工作。:D:D


6
如果有人在Android Studio 3.0稳定版中遇到相同的问题,强烈建议您查看stackoverflow.com/questions/46949761/…的答案,看看是否能为您提供帮助。
Bhavesh Patadiya

1
我遇到了同样的问题,我遵循了本页中提到的每种方法,但是并没有帮助我,所以我转到了gradle并将光标放在每个库上,以检查其新版本是否可用。那些拥有新版本的人,因此我进行了更新,同步gradle并运行。有效。
Shahzad Afridi

Answers:


293

从更新com.google.android.gms:play-services:11.2.2到时,我遇到了同样的问题com.google.android.gms:play-services:11.4.0。这为我解决了:

  1. 清洁
  2. 重建

您只会延迟该解决方案的实际问题。版本11.4.0可能包含较少的方法。请参阅下面的答案。您可能会在下一个依赖项中遇到此错误,我会添加
itzhar,2017年

2
这解决了我的问题,multiDexEnabled true
无论

28
与com.google.android.gms:play-services-location:11.6.0相同的问题...这不是有效的解决方案
issamux

3
当我使用Google Analytics(分析)库遇到兼容性问题时,此解决方案为我工作。在AS视图中,android项目导航器窗格为“ Project”,您应该看到“ External Libraries”,如果展开外部库,则会看到用于编译项目的所有jar和模块。它应该可以帮助您识别不兼容的模块组合。
AngryITguy

3
如果在“ compileSdkVersion 26”的情况下上述代码不起作用,请尝试执行此操作。设置| 构建,执行,部署| 即时运行并尝试启用/禁用
Sumit Saxena

325

我尝试了以上所有方法,但都无济于事。终于,我找到了适合我的工作:

app / build.gradle:

android {
    defaultConfig {
       multiDexEnabled true
    }
}

11
谢谢。我认为问题在于大多数答案都无法说明您是否包含无法重建的其他来源的JAR文件。multiDex似乎允许将原本不兼容的代码进行组合。
布伦登·怀特利

2
该解决方案为我工作,但除此之外,我不得不明确启用multidex的API <= 21 developer.android.com/studio/build/multidex.html
hamou92

2
尽管比接受的答案更相关,但我仍然收到“无法合并dex”消息
约翰·

13
没为我工作。有了这个更改,我得到了另一个错误:任务':app:transformClassesWithMultidexlistForDebug的执行失败
Atul,

1
是的,我住了5个小时,答案完全不同。但是我以某种方式意识到这是Multidex问题,并降落在这里。我是真的 谢谢你
sud007 '18 -10-2

59

注意警告!

有时您只需要消除警告错误就会自动消失。请参阅以下特殊情况:


我的模块级build.gradle文件中有以下两个依赖项:

implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support:recyclerview-v7:27.0.2'

和Studio 警告除了合并问题):

所有com.android.support库必须使用完全相同的版本规范(混合版本可能导致运行时崩溃)。发现的版本27.0.221.0.3。例子包括com.android.support:animated-vector-drawable:27.0.2com.android.support:support-v4:21.0.3

因此,我明确确定的版本com.android.support:support-v4(有关详细信息请参见此处,同时解决两个问题(警告和与dex合并有关的问题)

implementation 'com.android.support:support-v4:27.0.2'  // Added this line (according to above warning message)
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support:recyclerview-v7:27.0.2'

有关其他类似情况,请参见以下注释。


1
谢谢,这为我解决了这个问题。最初是由于添加eu.inloop:androidviewmodel:1.3.4
lsrom

1
确实,我只希望错误可以更精确
Amin Keshavarzian

1
非常感谢。我遇到过同样的问题。我使用的是v26,更新为sdk 27​​,并解决了该问题。
约翰尼

2
这应该是正确的答案。在添加了一个对依赖的库(airbnb / epoxy)后,我的构建停止工作support:design:26.1.0,而我还没有该依赖。我的其他支持库版本为27.1.0。添加版本support:design依赖性后27.1.0,我的问题已解决。
alashow

2
谢谢。你救了我的日子。
Nithinjith

37

就我而言,不幸的是,无论是Michel还是Suragch的解决方案都不适合我。

因此,我通过执行以下操作解决了此问题:

gradle:3.0中,不建议使用编译配置,应将其替换为实现api。有关更多信息,请阅读此处。您可以在Gradle Build Tool上阅读官方文档。

编译配置仍然存在,但不应使用,因为它不能提供api和实现配置所提供的保证。

最好使用实现api而不是编译

只需更换编译执行debugCompiledebugImplementationtestCompiletestImplementationandroidtestcompileandroidTestImplementation

例如:代替这个

compile 'com.android.support:appcompat-v7:26.0.2'
compile 'com.android.support:support-v4:26.1.0'
compile 'com.github.bumptech.glide:glide:4.0.0'

这样使用

implementation 'com.android.support:appcompat-v7:26.0.2'
implementation 'com.android.support:support-v4:26.1.0'
implementation 'com.github.bumptech.glide:glide:4.0.0'

之后

  • 删除项目中的.gradle文件夹(请注意,要查看.gradle,您需要在导航器的左上方切换到“ Project”视图)
  • 删除所有构建文件夹和gradle缓存。
  • 从“生成”菜单中,按“ 清理项目”按钮。
  • 任务完成后,从“生成”菜单中按“ 重建项目”按钮。

希望对您有所帮助!


2
谢谢,我要做的就是将编译更改为实现,并且编译成功,无需完成其他步骤。我更新了Facebook SDK后,构建开始失败
Shayno,2017年

2
为我工作-深入了解为什么?
亚历克斯

1
要删除的文件夹应该是- .gradle而不是./gradle
Gary Bak,

1
唯一对我有用的答案。谢谢!
迈克尔·理查森

1
谢谢,这是最酷的答案。它应该在搜索之上。为我工作。
危险

27
  1. 删除.gradle目录。

  2. 再次运行您的应用程序。

笔记

  • .gradle目录位于项目的根文件夹中。(您可能必须先显示隐藏的文件。)
  • 每当我使用Android 3.0更新依赖项模块时,都必须执行此操作。(Android Studio 3的最新版本似乎已解决了该问题。)

4
当我还执行了无效缓存并重新启动时,这对我有所帮助
Vasili Fedotov

我不敢相信,当这个固定我的问题。我曾试图更新的一切,清除所有编译关键字,更新了几个犯罪嫌疑人ILB版本..当我终于做到了这一点,它的工作..
hanzolo

你救了我的命!谢谢
Masterfego

24

.gradle根据Suragch的建议删除对我来说还不够。此外,我还必须执行一个Build > Clean Project

请注意,要查看.gradle,您需要在左上方的导航器中切换到“项目”视图:

切换至专案检视


23

我尝试了所有其他解决方案,但没有人为我工作。最后,我通过编辑使用相同的依赖版本来解决它build.gradle。我认为将库添加到使用不同支持版本或Google库的依赖项的gradle中时会发生此问题。

将以下代码添加到构建gradle文件中。然后cleanrebuild项目。

ps:对我来说这是旧的解决方案,因此您应该使用以下库的更新版本。

configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == 'com.android.support') {
        if (!requested.name.startsWith("multidex")) {
            details.useVersion '26.1.0'
        }
    } else if (requested.group == "com.google.android.gms") {
        details.useVersion '11.8.0'
        } else if (requested.group == "com.google.firebase") {
            details.useVersion '11.8.0'
          }
      }
}

5
尝试了所有其他解决方案,最终只有这有所帮助:/
Ante

@Ali Gurelli非常感谢,我尝试了许多解决方案,但仅此工作而已。
Bipin Bharti

感谢名单,但对我来说,我使用的版本details.useVersion '15 .0.0'
Elsunhoty

感谢您的解决方案。我也遇到了同样的问题。google tap and pay为10.0.0,其余所有库均为最新版本
R World

工作顺利感谢
Sankalp

14

如果(1。尝试清理和重建工作),那么好

否则,如果(2.尝试删除gradle工作)那么就好

else-> 3.尝试添加grade.properties

android.enableD8 = false

else-> 4.将multiDexEnabledtrue 添加到您的build.gradle

android {
    compileSdkVersion 26
    defaultConfig {
      ...
        minSdkVersion 15
        targetSdkVersion 26
        multiDexEnabled true
     ...
    }
}

并添加依赖项

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

可能第一个对您有用,依此类推,但实际上这取决于您对我的问题的性质

添加此库后出现错误

implementation 'com.jjoe64:graphview:4.2.2'

后来我发现我必须检查一下,并且必须添加相同版本的支持库。所以我必须尝试另一个版本

compile 'com.jjoe64:graphview:4.2.1'

并解决了问题。因此,请注意这一点。


3
解决此问题的最有用方法。我想在这里提到的是,您可以使用'gradlew app:transformDexArchiveWithExternalLibsDexMergerForDebug --stacktrace'cmd了解更多详细信息。我救了我,发现我必须启用multidex。希望对您有所帮助。
熊猫,

13

就我而言,问题是由于房间资料库造成的:

compile 'android.arch.persistence.room:runtime:1.0.0-alpha1'

更改为:

compile 'android.arch.persistence.room:runtime:1.0.0'

工作。


非常感谢,这对我有很大帮助!
菲尔(Phil)

很高兴找到这个答案。谢谢!
callOfCode

12

仅添加到上述解决方案中:

确保在多个位置(甚至在同一文件中)没有重复的依赖项指向它们的不同版本。


我认为这应该是在添加multiDexEnabled true之前先进行检查,然后尝试其他答案。谢谢!
Aleksandr A

11

嗨,我有同样的问题尝试了几乎所有东西。因此,经过6个小时的艰苦奋斗,终于我通过逐行调试所有内容解决了。

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

Google-services 3.0在playServiceVersion:11.6.0或更低版本的Studio 3.0中不支持firebase。

implementation "com.google.firebase:firebase-messaging:$rootProject.ext.playServiceVersion"
implementation "com.google.firebase:firebase-core:$rootProject.ext.playServiceVersion"
implementation "com.firebase:firebase-jobdispatcher-with-gcm-dep:$rootProject.ext.jobdispatcherVersion"

解决方案:

我将Google服务更改为

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

并且它支持Firebase服务。

希望有人可以节省时间。


1
我在使用playServiceVersion作为11.4.0实现“ com.google.firebase:firebase-core:11.4.0”时遇到了同样的问题,将其更改为实现“ com.google.firebase:firebase-core:11.6.2”问题 。因此,请验证其他lib的版本依赖性
durgeshtrivedi

9
  1. 启用

    defaultConfig {multiDexEnabled true}

  2. 如果第1步不起作用,则

    转到项目结构,找出使用其他版本的外部库。双击它并删除其jar文件。关闭项目,然后再次打开,android studio将重建项目。问题应该消失了。


+1-我有lib,rxjava和第3方依赖项(13k行)。看到方法计数时,我的眼睛几乎突然冒出。
snodnipper

6

一种可能是:存在相同的库,但依赖项中具有不同的版本

我在gradle文件中的以下几行有此问题:

  • compile fileTree(include: ['*.jar'], dir: 'libs')
  • compile 'com.google.code.gson:gson:2.8.2'

gson库位于我的libs目录中,但具有以前的版本。我gson-2.3.1.jar从libs目录中删除了,一切恢复正常。


compile fileTree(include: ['*.jar'], dir: 'libs')为我删除固定内容。.谢谢(y)
Dinuka Salwathura

5

如果在包含Kotlin支持后为您显示了此错误,并且没有其他解决方案起作用,请尝试将应用模块的Kotlin依赖项更改build.gradle为:

implementation ("org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version") {
    exclude group: 'org.jetbrains', module: 'annotations'
}

这在Android Studio 3.0 Beta 6上对我有效。请参见此答案以获取进一步的说明。


是的,如果不排除注释,似乎Kotlin的介绍可能会破坏构建。
Stoycho Andreev '18

谢谢。这是我的解决办法。我花了3天的时间才能确定自己的问题。
Naveen Kumar M

尝试升级到Kotlin插件版本1.2.30(刚刚发布)。现在也可以再次启用Instant Run!
KTCO


5

[无法解决DEX合并]数小时的堆栈溢出后,我解决了“无法合并DEX错误”

  1. 将gradle中的所有com.android.support行更新为v27.1.0

原因-Android已将其支持库更新为v27.1.0,因此您必须将gradle文件中的所有android支持行从26.1.0更改为27.1.0。

  1. 确保存储库部分包含带有“ https://maven.google.com ”端点的maven部分。例如:

    allprojects {储存库{jcenter()maven {url“ https://maven.google.com ”}}}}

原因:-Android无法在SDK管理器中更新支持库,现在它使用maven.google.com进行更新,因此您必须包括该支持才能使用27.1.0支持库

更改版本后: 1.清理项目2.重建项目


4

在下面添加命令:

android {
...

    dexOptions {

        jumboMode true
        javaMaxHeapSize "4g"

    }
}

4

安装Google Play服务(最新版本)+,包括

android {
    defaultConfig {
        multiDexEnabled true
        }
}

在build.gradle中为我解决了这个问题,请确保清理并重建项目!


3

就我而言,它是 gson-2.8.1.jar,我已将其添加到项目的libs文件夹中。但是SDK已经提供了参考。因此,无需将gson-2.8.1.jar添加到libs文件夹。

当我将其取出时,gson-2.8.1.jar项目编译时不会出现此异常错误。

因此,请尝试修改libs文件夹和依赖项


3

我同意小克里斯。如果您使用Firebase嵌入AdMob广告(即使不是,也可以),则即使您没有将play-services广告添加为依赖项,play-services-analytics也会包含play-services-ads。Google显然在其11.4.0的推出过程中犯了一个错误,因为分析包含的是10.0.1版的广告,而不是11.4.0版(gradle中的鼠标悬停提示显示了这一点)。

我手动在顶部添加了编译'com.google.android.gms:play-services-ads:11.4.0',但是只有在禁用即时运行后,它才起作用: http ://stackoverflow.com/a/35169716/530047

因此,它要么退回到10.0.1,要么添加广告并禁用“即时运行”。这就是我发现的有帮助的地方。


OP是否提到Play服务?
IgorGanapolsky

批准的答案确实如此。如果在没有这种情况的情况下这个问题浮出水面,那么我不知道!
乔纳森

2

我遇到了同样的问题,并找到了我的案子的真正原因。以前,我也再次尝试了所有先前的答案,但是并不能解决问题。我的磨损应用程序项目中有两个模块,build.gradle如下:

磨损模块的build.gradle:

implementation project(':common')
implementation files('libs/farmer-motion-1.0.jar')

通用模块的build.gradle:

implementation files('libs/farmer-motion-1.0.jar')

在升级到gradle 3.x之前,“实现”都是“编译”的。

我使用--stacktrace选项运行gradlew以获取堆栈跟踪,出现此问题时,您只需在gradle控制台窗口上单击此即可。并发现重复依赖于jar包:

Caused by: com.android.dex.DexException: Multiple dex files define Lcom/farmer/motion/common/data/pojo/SportSummary$2;

阅读官方迁移指南后,在farmer-motion-1.0.jar包中将SportSummary类别,我将build.gradle更改为:

磨损模块的build.gradle:

implementation project(':common')
// delete dependency implementation files('libs/farmer-motion-1.0.jar')

通用模块的build.gradle:

api files('libs/farmer-motion-1.0.jar') // change implementation to api

现在,wear模块将具有公共模块所依赖的farmer-motion-1.0.jar导出。如果在运行时不依赖jar包,则jar包的 ' implementation '依赖也可以更改为'compileOnly'


2

我也有问题。

我能够通过改变来解决compileSdkVersion,并targetSdkVersion到最新版本。


2

对于我们的项目,我们意外地两次将相同的jar添加了不同的名称。删除其中一个解决了该问题。


这解决了我的问题。我正在构建一个内部android库项目,在其libs文件夹下,我有两个jar文件,其中一个只是另一个的备份,但文件名不同。
霍皮亚'18

2

这可能不是您的问题,但是当我在项目的dependencies {}部分中意外包含两个相同(但名称不同)的库时,出现了此错误。


1

对我来说,它正在更新app \ build.gradle中的firebase消息传递

compile 'com.google.firebase:firebase-messaging:10.0.1'

compile 'com.google.firebase:firebase-messaging:11.4.2'

1

可能的根本原因之一:Android Studio导入多模块项目无法正确处理重复的临时依赖项。检查您的列表并将其删除。对我来说,解决方法是这样的:

--- a/project/module/build.gradle
+++ b/project/module/build.gradle
@@ -21,5 +21,4 @@ android {
 dependencies {
     implementation project(':upstream-dependency-project')
     implementation 'com.android.support:support-v4:18.0.0'
-    implementation files('libs/slf4j-android-1.6.1-RC1.jar')
 }

1

我为我的项目找出了这个问题的原因。我在build.gradle中两次添加了一个依赖项。一次通过添加依赖关系,一次通过添加jar依赖关系:

编译'org.achartengine:achartengine:1.2.0'
...
实现文件('../achartengine-1.2.0.jar')

删除第一行后问题就解决了。


1

万一最重要的答案对您没有用,您的问题可能是您有多个依赖于同一库的依赖项。

这里是一些调试技巧。在此示例代码中, com.google.code.findbugs:jsr305:3.0.0是有问题的库。

每次修改以检查解决方案时,请始终清洁并重建!

  1. 使用--stacktrace标记构建以获取更多详细信息。它将抱怨一个类,Google在该类中找到该库。这是设置Android Studio使其始终与--stacktraceflag 一起运行的方法

  2. View > Tool Windows > Gradle Console构建后浏览一下Android Studio中的Gradle控制台

  3. 通过运行检查重复的依赖关系./gradlew -q app:dependencies。您可以在每次修改build.gradle时重新运行它。

  4. 在build.gradle中,

    android {
            ...
            configurations.all {
                resolutionStrategy {
                    // Force a particular version of the library 
                    // across all dependencies that have that dependency
                    force 'com.google.code.findbugs:jsr305:3.0.0'
                }
            }
    }
  5. 在build.gradle中,

    dependencies {
        ...
        implementation('com.google.auth:google-auth-library-oauth2-http:0.6.0') {
            // Exclude the library for this particular import
            exclude group: 'com.google.code.findbugs'
        }
    }
  6. 在build.gradle中,

    android {
        ...
        configurations.all {
            resolutionStrategy {
                // Completely exclude the library. Works for transitive
                // dependencies.
                exclude group: 'com.google.code.findbugs'
            }
        }
    }
  7. 如果您的某些依赖项位于jar文件中,请打开jar文件并查看是否存在任何冲突的类名。如果是这样,您可能必须使用新的类名重新构建jar或考虑使用shading

更多背景资料:


1
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
}

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

2
你能详细说明吗?
sg7 '18

我也遇到了同样的问题,但是我意识到当时可以解决我的问题,但是在将来的更新中,情况可能会发生实际变化。
伊本·沃茨

1

以我为例,一个库导致了这个问题,库已成功添加到项目中,但是当我运行我的应用程序时,它向我显示此错误。因此,如果您也遇到这种情况,则可以转到github并检查问题或提出新问题。如果您找不到有关该库的任何解决方案,建议您替换它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.