Android编译遇DexArchiveMergerException:重复类问题求助
你遇到的核心问题是SA.aar和com.google.ar:core:1.12.0两个依赖包包含了完全重复的类——不管是混淆后的短类名如a.a.a,还是Google的内部类com.google.a.a.a,这直接导致D8合并Dex文件时抛出冲突错误。下面是几个可行的解决思路,按优先级从高到低排列:
1. 先理清依赖关系,排查重复来源
首先用Gradle命令查看项目依赖树,确认AR Core是直接引入还是间接依赖的,以及SA.aar是否内置了AR Core的代码:
# macOS/Linux ./gradlew app:dependencies # Windows gradlew.bat app:dependencies
在输出里搜索com.google.ar:core,看看它的引入路径。如果SA.aar本身已经依赖了AR Core,那你可能不需要再单独引入AR Core,直接去掉项目中对com.google.ar:core的依赖即可。
2. 排除重复的依赖模块
如果必须同时保留两个依赖,可以在引入其中一个时排除重复的包。比如如果是直接引入AR Core,就排除和SA.aar重复的类所在的包:
implementation 'com.google.ar:core:1.12.0' { // 排除Google内部重复的包 exclude group: 'com.google.a', module: 'a' }
⚠️ 注意:混淆后的a.a.a这类类通常没有明确的包组信息,这种方法可能不适用,需要用下面的pickFirst规则。
3. 使用Gradle的pickFirst规则强制选择其中一个类
在你的app模块的build.gradle文件的android块中添加packagingOptions,告诉构建工具遇到重复类时优先选择第一个找到的版本:
android { // 其他已有配置... packagingOptions { pickFirst 'a/a/a.class' pickFirst 'a/a/b.class' pickFirst 'com/google/a/a/a.class' pickFirst 'com/google/a/a/b.class' } }
使用前要确认这两个依赖中的重复类是完全一致的,或者你选择的版本更适配项目,否则可能会导致运行时的类版本不兼容问题(比如方法找不到、逻辑错误等),一定要做好全面测试。
4. 升级AR Core版本到最新稳定版
旧版本的AR Core可能包含一些已经被移除或重构的内部类,尝试升级到最新的稳定版本,大概率能解决重复类的问题:
implementation 'com.google.ar:core:1.32.0' // 替换为最新稳定版,可根据官方信息调整
新版本的AR Core通常会优化内部结构,避免这类和第三方库的冲突。
5. 优化SA.aar的打包方式(如果可控)
如果SA是你们团队内部开发的模块,或者你能联系到提供者,建议让他们修改SA模块的构建配置:不要将AR Core的代码直接打包进aar,而是改为通过Gradle依赖引入AR Core。比如在SA模块的build.gradle中:
// 不要把AR Core的class文件打包进aar,而是用依赖 implementation 'com.google.ar:core:xxx'
这样你的主项目引入SA时,会通过传递依赖获取AR Core,不会出现重复打包的问题。
内容的提问来源于stack exchange,提问作者Nouman Shah

