升级AGP至8.0.2后执行R8混淆Android应用时出错求助
AGP 8.0.2升级后R8混淆构建错误解决方案
错误原因
AGP 8.x版本的R8混淆器对类继承关系的校验更严格,当测试相关类(android.test包下的类)和JUnit类同时被打包到Release构建中时,就会触发这类"库类继承程序类"的冲突错误——系统的android.test类属于库类,而JUnit类如果被误打包进Release就会被标记为程序类,两者的继承关系违反了R8的校验规则。
解决步骤
1. 检查依赖配置,隔离测试依赖
确保所有测试相关依赖仅声明在testImplementation或androidTestImplementation源集下,不要放在implementation或api中(这些会被打包到Release构建):
// 正确配置 testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' // 错误示例(会导致JUnit类被打包进Release) // implementation 'junit:junit:4.13.2'
2. 排除第三方依赖中的测试类
如果某个第三方依赖意外引入了JUnit或android.test相关类,在依赖声明中手动排除:
implementation('com.example:some-library:1.0.0') { exclude group: 'junit', module: 'junit' exclude group: 'android.test' }
3. 添加R8规则临时绕过校验(仅当依赖无法调整时使用)
如果无法彻底移除冲突类,可以在proguard-rules.pro中添加规则让R8忽略这类冲突:
// 忽略android.test和JUnit相关的警告与冲突 -dontwarn android.test.** -dontwarn junit.framework.** -dontwarn junit.runner.** // 允许修改访问权限,解决继承冲突 -allowaccessmodification
4. 检查源码目录配置
确认项目的sourceSets没有误将测试代码目录(如src/test/、src/androidTest/)包含进主源码集:
android { sourceSets { main { java.srcDirs = ['src/main/java'] // 避免误加测试目录 // java.srcDirs += ['src/test/java'] } } }
5. 彻底清理缓存
执行以下操作确保缓存不影响构建:
- 执行Gradle的
clean任务 - 删除项目根目录下的
.gradle文件夹 - 重新Sync项目并执行Release构建
内容的提问来源于stack exchange,提问作者JBokMan95
相关产品推荐
相关产品推荐

