如何配置ProGuard/R8以避免j$.time.ZoneId引发的java.lang.VerifyError运行时异常
解决Desugar+R8混淆导致的
j$.time.ZoneId VerifyError问题 这个问题的根源是Desugar生成的Java 8时间API兼容类(j$.time包下的类)被R8的混淆/优化破坏了类结构或方法签名,导致虚拟机加载时验证失败。全局关闭混淆(-dontobfuscate)虽然能解决,但显然没必要——我们只需要针对性保护这些Desugar生成的兼容类即可。
推荐的ProGuard/R8配置方案
在你的混淆配置文件(比如proguard-rules.pro)中添加以下规则,保留j$.time包下所有类、接口及其成员:
# 保护Desugar生成的Java 8时间API兼容类,避免混淆/优化破坏结构 -keep class j$.time.** { *; } -keep interface j$.time.** { *; }
这条规则会告诉R8不要混淆j$.time包下任何类的名称、方法名和字段名,也不会移除这些类的任何成员,确保Desugar生成的兼容逻辑能正常运行。
额外检查建议
- 确认你的Android Gradle Plugin(AGP)和Desugar版本匹配:你当前使用的AGP 7.0.0-beta03搭配Desugar 1.0.9是兼容的,但后续升级AGP时,记得同步升级
desugar_jdk_libs的版本,避免版本不兼容带来的问题。 - 检查是否有其他混淆规则意外影响了
j$.time包:比如如果配置了-keepclasseswithmembers等规则,确保它们没有过滤掉这些兼容类的必要成员。
内容的提问来源于stack exchange,提问作者Robert Estivill
相关产品推荐
相关产品推荐

