升级Gradle至3.6.0以上版本出现ClassNotFoundException如何解决
Gradle升级R类找不到报错低负担解决方案
报错根因:AGP 3.6.0版本开始默认将编译生成的R.java打包为R.jar,同时默认开启R类资源ID常量内联、无用R类裁剪优化,当代码中存在反射调用三方库/模块R类资源的逻辑时,就会出现类找不到的运行时错误。
最低侵入处理方案(无需修改业务代码)
- 针对报错的特定组件加混淆保留规则
在主模块的proguard-rules.pro文件中添加对应包名的R类保留规则即可,以你提到的androidx.startup报错为例:
-keep class androidx.startup.R$* { <fields>; }
如果有其他库出现同类报错,仅需替换规则中的包名即可,单条规则适配单个报错场景,无全局配置副作用。
- 全局关闭R类优化开关
如果批量出现大量不同库的同类报错,不想逐个加规则,可以在项目根目录的gradle.properties中添加全局配置直接关闭相关优化:
# 关闭R类JAR打包优化 android.enableAppCompileTimeRClass=false # 关闭R类非传递性优化,保留旧版本R类行为 android.nonTransitiveRClass=false
配置添加后全量重新编译即可解决问题,不需要调整任何业务逻辑。
长期适配低改造方案
如果后续需要适配AGP 7.0+的标准规范,仅需改造代码中反射调用R类的零散逻辑:
将原本反射获取R类资源ID的逻辑,替换为官方推荐的资源ID动态获取方式:
// Kotlin示例 val resId = context.resources.getIdentifier("资源名称", "string", context.packageName)
// Java示例 int resId = context.getResources().getIdentifier("资源名称", "string", context.getPackageName());
仅需要修改存在反射调用R类的对应代码行,其余业务逻辑无需调整。
内容的提问来源于stack exchange,提问作者Alex Drozd
相关产品推荐
相关产品推荐

