升级Android Gradle Plugin 8.2.2后R8混淆Android应用报错求助
近期将Android项目的Android Gradle Plugin(AGP)从7.4.2版本升级到8.2.2版本后,执行release构建的minifyReleaseWithR8任务时失败,报错信息如下:
Task :app:minifyKioskDebugWithR8 FAILED
AGPBI: {"kind":"error","text":"com.android.tools.r8.ResourceException: com.android.tools.r8.internal.vc: I/O exception while reading '/Users/harinikesh/StudioProjects/instore/app/build/intermediates/merged_java_res/kioskDebug/base.jar': /Users/harinikesh/StudioProjects/instore/app/build/intermediates/merged_java_res/kioskDebug/base.jar","sources":[{"file":"/Users/harinikesh/StudioProjects/instore/app/build/intermediates/merged_java_res/kioskDebug/base.jar"}],"tool":"R8"}
com.android.tools.r8.ResourceException:
com.android.tools.r8.internal.vc: I/O exception while reading
'/Users/harinikesh/StudioProjects/instore/app/build/intermediates/merged_java_res/kioskRelease/base.jar':
/Users/harinikesh/StudioProjects/instore/app/build/intermediates/merged_java_res/kioskRelease/base.jar
我的release构建配置如下:
release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' }
当将shrinkResources和minifyEnabled设为false时,构建可成功完成。该问题仅在升级AGP后出现,已尝试清理项目、更新所有依赖,但问题仍未解决。
检查base.jar文件状态
直接前往报错路径查看base.jar是否存在,或文件是否损坏:- 打开路径
/Users/harinikesh/StudioProjects/instore/app/build/intermediates/merged_java_res/kioskRelease/ - 尝试解压
base.jar,若解压失败说明文件已损坏,手动删除整个build目录后重新构建
- 打开路径
调整R8资源处理规则
AGP 8.x对R8的资源处理逻辑有更新,可在proguard-rules.pro中添加规则排除冲突资源:-keepresources directory **/或针对特定资源类型保留:
-keepresources string/** -keepresources layout/**拆分压缩配置排查
暂时单独关闭shrinkResources,保留minifyEnabled,验证是否能完成构建:release { shrinkResources false minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' }若构建成功,再逐步排查具体是哪些资源导致压缩冲突。
强制更新R8版本
AGP 8.2.2对应的R8版本可能存在已知bug,可在项目根目录build.gradle中指定最新稳定版R8:buildscript { dependencies { classpath 'com.android.tools:r8:8.2.34' // 替换为当前最新稳定版 } }排查第三方依赖兼容性
部分第三方依赖可能未适配AGP 8.x的R8规则,逐个排查近期更新的依赖,尝试回退到兼容版本,或查看依赖库官方文档的AGP 8.x适配说明。
内容的提问来源于stack exchange,提问作者Hari Nikesh R

