更新Android Studio及构建工具后出现Dex合并错误求助
解决Android Studio 3.1 + Gradle 4.4 + 插件3.1下的Dex合并错误
我之前升级到这个版本组合时也碰到过一模一样的transformDexArchiveWithExternalLibsDexMergerForDebug错误,网上的通用方案试了一圈踩了不少坑,最后结合这个版本的特性才搞定,给你几个针对性的排查方向:
先清缓存再重启,这是最容易被忽略的第一步
升级后Android Studio的缓存经常会出问题,别直接就去改配置:- 点击顶部菜单栏的
File > Invalidate Caches / Restart,选择Invalidate and Restart - 重启后手动删除项目根目录的
.gradle文件夹、app模块下的build文件夹,再点击Sync Project with Gradle Files
很多时候这个操作就能直接解决莫名其妙的dex合并问题。
- 点击顶部菜单栏的
检查Multidex配置是否正确
因为你用的compileSdkVersion是27,结合Gradle插件3.1,Multidex的配置要严格对应:- 在app的
build.gradle的defaultConfig里开启multidex:defaultConfig { compileSdkVersion 27 minSdkVersion 你的最低版本 targetSdkVersion 27 // 新增这一行 multiDexEnabled true } - 添加Multidex依赖:
dependencies { implementation 'com.android.support:multidex:1.0.3' } - 如果你的项目有自定义Application类,要么让它继承
MultiDexApplication,要么在attachBaseContext方法里手动初始化:@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
- 在app的
排查依赖冲突,这是这个版本高发的问题
Gradle 4.4的依赖解析逻辑有变化,很容易出现同一库多版本冲突:- 在Terminal里执行依赖树命令:
- Mac/Linux:
./gradlew app:dependencies - Windows:
gradlew.bat app:dependencies
仔细看输出里的compile或implementation依赖,有没有同一类库出现不同版本的情况(比如support-v4同时出现27.0.2和27.1.1)
- Mac/Linux:
- 强制统一依赖版本,在app的
build.gradle的android块下添加:configurations.all { resolutionStrategy { // 把所有support库强制统一到compileSdk对应的版本 force 'com.android.support:appcompat-v7:27.1.1' force 'com.android.support:support-v4:27.1.1' force 'com.android.support:design:27.1.1' // 其他出现冲突的库也可以在这里强制指定版本 } }
另外还要注意有没有第三方库自带了重复的类(比如有些老的广告库会打包support类),可以暂时移除非必要的依赖,逐步排查出问题库。
- 在Terminal里执行依赖树命令:
调整Gradle内存配置,避免内存不足导致合并失败
Android Studio 3.1对内存的要求更高,很容易因为堆内存不够导致dex合并失败:- 在app的
build.gradle的android块下添加dexOptions:dexOptions { javaMaxHeapSize "4g" // 把堆内存调到4G,根据你的电脑配置可以适当调整 preDexLibraries = false } - 打开项目根目录的
gradle.properties,确保内存配置足够:org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
- 在app的
检查是否有不兼容的旧依赖
有些比较老的第三方库(比如几年没更新的SDK)和Gradle 4.4 + 插件3.1兼容性很差,你可以尝试暂时注释掉一些非核心的依赖,重新构建,如果能成功,再逐个加回去找出问题依赖,然后考虑升级该库或者寻找替代方案。
如果还是不行,可以把build.gradle的完整内容贴出来,或者把错误日志的完整堆栈信息发出来,这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者K Guru
相关产品推荐
相关产品推荐

