升级Realm库至4.3.1后出现DexArchiveMergerException问题求助
Hey,我之前升级Realm时也碰到过几乎一模一样的Dex合并报错,试了常规的清理构建没用,后来靠这几个步骤解决了,你可以挨个试试:
统一所有模块的Realm版本
大概率是项目里某个子模块或者依赖库还在用旧的4.2.0版本,和新的4.3.1冲突了。建议在项目根目录的build.gradle里统一配置版本变量:ext { realmVersion = "4.3.1" }然后所有模块的Realm依赖都用这个变量,比如:
implementation "io.realm:realm-android-library:$realmVersion",这样能彻底避免版本不一致的问题。排查并排除重复依赖
运行./gradlew app:dependencies(Windows系统用gradlew.bat app:dependencies)生成依赖树,仔细找有没有其他库间接引入了旧版Realm或者重复的dex相关依赖。如果发现了,用exclude语法把重复的部分去掉,比如:implementation('第三方依赖库的坐标') { exclude group: 'io.realm' }开启MultiDex(如果还没启用)
升级库后可能新增了一些方法,导致总方法数超过了65536的限制,触发Dex合并失败。在app/build.gradle里开启MultiDex:android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'com.android.support:multidex:1.0.3' }要是你的自定义Application没有继承
MultiDexApplication,记得在attachBaseContext方法里初始化:@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }手动清理深层缓存
有时候Android Studio的“清理/缓存失效”不够彻底,你可以手动删除这些目录:- 项目根目录下的
.gradle文件夹 app/build文件夹- 系统用户目录下的
.gradle/caches文件夹(比如Windows的C:\Users\你的用户名\.gradle\caches)
删完后重新同步项目再构建,应该能清除残留的旧编译文件。
- 项目根目录下的
核对注解处理器版本
升级Realm库的同时,注解处理器的版本也要对应上,不然容易生成冲突的dex文件。在app/build.gradle里检查:// Java项目用这个 annotationProcessor "io.realm:realm-android-compiler:$realmVersion" // Kotlin项目换成kapt kapt "io.realm:realm-android-compiler:$realmVersion"
内容的提问来源于stack exchange,提问作者Ido Kahana

