Android项目因两依赖引用同一组件触发DexArchiveMergerException
这问题我碰到过好多次了!你遇到的org.gradle.api.tasks.TaskExecutionException加上Program type already present错误,本质就是两个依赖库重复引入了同一个组件(可能是同一版本,也可能是不同版本),导致Dex合并时检测到重复类,直接抛出异常罢工了。给你一步步拆解解决办法:
第一步:定位冲突的依赖组件
首先得搞清楚到底是哪个组件被重复依赖了,最直接的方式是查看完整的依赖树:
- Mac/Linux终端执行:
./gradlew app:dependencies - Windows命令行执行:
gradlew.bat app:dependencies
或者用Android Studio的可视化工具:打开右侧Gradle面板,找到你的app模块,展开Tasks→android,双击androidDependencies,就能在控制台看到所有依赖的层级关系。
然后在输出里搜索报错信息中Program type already present:后面跟着的类名,就能定位到是哪两个依赖重复引入了这个组件。
第二步:排除重复的依赖
找到冲突组件后,只需要在其中一个依赖声明里排除掉这个重复组件就行。举个例子,假设冲突组件是com.example:core-lib,可以这样修改依赖配置:
dependencies { implementation('<dependency #1>') { // 排除指定组和模块的重复依赖 exclude group: 'com.example', module: 'core-lib' } implementation('<dependency #2>') }
如果拿不准排除哪一个,优先保留对你项目功能更重要的那个依赖版本对应的组件。
第三步:强制统一依赖版本(可选)
如果多个依赖都依赖同一个组件的不同版本,也可以强制让Gradle使用指定版本的组件,从根源避免版本不一致导致的冲突。在app模块的build.gradle里添加这段配置:
android { // 你的其他Android配置... } configurations.all { resolutionStrategy.force 'com.example:core-lib:1.5.0' // 替换成你需要的目标版本号 } dependencies { // 你的依赖声明... }
额外补充
如果上面的方法都试过还是不行,可以检查是否开启了MultiDex(当项目方法数超过65536时需要)——虽然这一般不是重复类问题的直接原因,但可以作为兜底方案:
在build.gradle的android块里添加:
android { defaultConfig { // 其他配置... multiDexEnabled true } }
同时在依赖里添加:implementation 'androidx.multidex:multidex:2.0.1'(使用AndroidX的情况下)
内容的提问来源于stack exchange,提问作者Coach Roebuck

