升级Compose BOM 2024.06.00及SDK34后R8混淆构建失败
问题背景
项目迁移至SDK34后,将Compose BOM从2023.06.01升级到2024.06.00,Debug构建正常,但Release构建在R8混淆阶段先后出现两类错误:先是多个Compose相关META-INF错误,添加排除规则后又触发androidx.collection.ArrayMap$EntrySet类重复定义的报错。环境信息:Gradle 8.3.0、AGP 8.4、Kotlin 1.9.22、Target SDK 34。
1. 为何升级Compose BOM 2024.06.00后出现此错误?
Compose BOM会统一管理所有Compose相关依赖的版本,升级到2024.06.00后,间接提升了androidx.collection库的版本——尽管ArrayMap不属于Compose核心组件,但Compose的runtime、ui等模块会依赖androidx.collection处理集合操作。
另外你之前的排除规则存在错误:exclude group: "androidx.collection.ArrayMap"是无效写法,group应为androidx.collection而非具体类名。这导致动态功能模块仍从:mobile模块传递引入了androidx.collection,同时动态模块自身可能也通过其他依赖引入了该库的相同/不同版本,最终在R8合并字节码时出现类重复定义。
2. 如何解决Release构建中的「类重复定义」问题?
步骤1:修正依赖排除规则
将动态功能模块中错误的排除规则替换为正确的组排除:
implementation(project(path: ':mobile')) { exclude group: "com.russhwolf" exclude group: "androidx.compose" // 单个规则覆盖所有Compose组,无需逐个枚举 exclude group: "androidx.collection" // 正确排除整个androidx.collection组 }
步骤2:统一androidx.collection版本
在项目根目录的build.gradle(或settings.gradle的dependencyResolutionManagement块)中强制指定androidx.collection的版本,确保所有模块使用同一版本:
// 根build.gradle allprojects { configurations.all { resolutionStrategy { force "androidx.collection:collection:1.3.0" // 替换为项目适配的稳定版本 } } }
步骤3:清理冗余依赖
检查动态功能模块是否直接引入了androidx.collection,如果有则删除该直接依赖,改为通过:mobile模块传递引入(或保持版本统一)。
3. 若为库版本冲突,如何确定引发问题的版本?
方法1:生成依赖树排查
执行Gradle命令查看动态功能模块的Release依赖树,精准定位androidx.collection的来源和版本:
./gradlew :dynamicFeature:dependencies --configuration releaseRuntimeClasspath
在输出中搜索androidx.collection:collection,对比:mobile模块和动态模块各自依赖的版本,确认是否存在版本差异。
方法2:对比Compose BOM版本差异
查看Compose BOM 2023.06.01与2024.06.00的依赖清单,确认后者是否调整了androidx.collection的依赖版本。可通过执行命令查看BOM的具体依赖:
./gradlew dependencies --configuration classpath | grep "compose-bom"
找到对应BOM版本后,追溯其包含的androidx.collection版本,验证是否是升级后引入的新版本导致冲突。
内容的提问来源于stack exchange,提问作者Shubham Bhattacharyya

