Android开发:如何修复编译时出现的Multiple dex files重复定义异常
嘿,这个Dex合并冲突的问题我太熟了!你遇到的是典型的重复类定义错误,根源是项目里多次引入了包含MqttAndroidClient的MQTT相关库,导致打包时Dex文件里出现了同一个类的多个副本。先把你碰到的错误信息贴出来方便对照:
Error:com.android.dex.DexException: Multiple dex files define Lorg/eclipse/paho/android/service/MqttAndroidClient$MyServiceConnection;
FAILURE: Build failed with an exception.
- 出错原因:任务':app:transformDexArchiveWithExternalLibsDexMergerForDebug'执行失败。
java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: 无法合并dex
- 建议:使用--info或--debug选项获取更多详细信息。
下面是一步步的解决办法,亲测有效:
首先得搞清楚到底是哪个依赖重复引入了MQTT库。在Android Studio的终端里执行这个Gradle命令,生成项目的依赖树:
./gradlew app:dependencies
在输出结果里搜索org.eclipse.paho,你就能看到哪些依赖(不管是直接还是间接的)引入了org.eclipse.paho.android.service这个库——大概率是同一个库被加了两次,或者不同的第三方库都带了这个依赖。
找到重复项后,就可以用Gradle的exclude语法把多余的依赖去掉。举个例子:
如果你的项目里同时直接引入了paho.android.service,又有一个第三方库也间接带了这个库,就可以修改第三方库的依赖声明:
implementation('com.example:some-third-party-lib:1.0.0') { // 排除重复的MQTT服务库 exclude group: 'org.eclipse.paho', module: 'org.eclipse.paho.android.service' }
或者如果是同一个库被不同依赖引入了不同版本,你可以强制指定一个统一版本,避免冲突:
configurations.all { resolutionStrategy.force 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' // 替换成你需要的稳定版本 }
调整完依赖后,一定要清理旧的构建缓存,不然可能还会有残留问题:
- 点击Android Studio顶部菜单栏的
Build > Clean Project - 等清理完成后,再点击
Build > Rebuild Project
如果你的项目方法数确实超过了65536的限制(不过你的错误更偏向重复类,但保险起见可以检查下),需要开启MultiDex:
- 在Module级别的
build.gradle里添加依赖:
implementation 'com.android.support:multidex:1.0.3'
- 在
defaultConfig块里开启MultiDex:
defaultConfig { multiDexEnabled true }
- 如果有自定义的Application类,让它继承
MultiDexApplication,或者在attachBaseContext方法里初始化:
public class MyApp extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
按照这个流程走下来,基本就能解决这个Dex合并的问题啦~
内容的提问来源于stack exchange,提问作者Dersim

