升级至Gradle 7.0.2和AGP 7.0.2后出现ClassNotFoundException错误是什么原因?

错误产生原因
- AGP 7.0.2 及以上版本默认强制要求使用JDK 11作为编译运行环境,而JDK 9之后对内部私有API做了强隔离限制,
jdk.internal.reflect包下的所有类都属于JDK内部实现,默认不会对应用层暴露,类加载器无法直接加载该路径下的类。 - 项目中存在自定义序列化逻辑,或是依赖的第三方序列化库(比如旧版本fastjson、gson、kryo等)是基于JDK 8开发的,代码中直接引用了
jdk.internal.reflect下的反射构造器访问类,运行到对应序列化逻辑时就会触发类找不到的异常。 - 少数场景下是开启了R8代码混淆/资源缩减时,添加了错误的移除规则,把运行时动态生成的
GeneratedSerializationConstructorAccessor系列类判定为无用类被提前裁剪,运行时找不到对应类也会抛出该异常。
可选修复方案
- 优先排查项目中用到的序列化相关依赖,升级到适配JDK 11的最新版本,从根源避免依赖JDK内部API的问题。
- 若必须使用不兼容的旧库,可以在
gradle.properties中添加JVM参数开放对应内部包的访问权限:
org.gradle.jvmargs=--add-opens java.base/jdk.internal.reflect=ALL-UNNAMED
- 检查R8/proguard混淆规则,添加如下规则避免动态生成的类被移除:
-keep class jdk.internal.reflect.** { *; }
内容的提问来源于stack exchange,提问作者jitendra kumar
相关产品推荐
相关产品推荐

