Android核心库脱糖后ZonedDateTime序列化TimeOffset为null问题
问题描述
我正尝试从ThreeTen Android Backport迁移至支持脱糖的java.time方案。Debug构建版本运行完全正常,但在minifyEnabled = true的Release构建版本中,运行时出现异常。
ZonedDateTime经序列化(通过Intent中的Bundle传递)后,其TimeOffset字段丢失:
- 序列化前:
2022-06-07T02:00+02:00 - 反序列化后:
2022-06-07T02:00null
当前使用Gradle 7.2.1版本(AGP 7.3.3),按照Android官方文档配置基础脱糖方案,即便将兼容版本调整为Java 11,问题仍未解决,当前配置代码如下:
android { ... compileOptions { // 开启java.time等新语言API支持 coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8 } ... } dependencies { coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" }
2022年6月9日更新:提供问题最小复现示例,该问题仅在
minifyEnabled = true时触发:val zonedDateTime = ZonedDateTime.parse("2022-06-07T02:00:00.000+02:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSVV")) // zonedDateTime.toString() == "2022-06-07T02:00+02:00" val bundle = Bundle() bundle.putSerializable("date", zonedDateTime) bundle.getSerializable("date") // .toString() == "2022-06-07T02:00null"
问题原因
该问题由R8/ProGuard混淆裁剪逻辑导致。开启代码压缩后,R8默认会移除它判定为“无用”的类成员、混淆类名与字段名,而脱糖后的java.time类属于脱糖库动态加载的内容,默认混淆规则没有覆盖这些可序列化类的必要字段、序列化/反序列化方法,导致反序列化时时区偏移量字段无法被正确读取,最终出现null的异常表现。
修复方案
- 在模块的混淆配置文件(通常为
proguard-rules.pro)中添加如下规则,避免java.time相关类被错误混淆、裁剪:
# 保留java.time包下所有类的必要成员,保证序列化正常 -keep class java.time.** { *; } -keepclassmembers class java.time.** implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); }
如果使用2.x版本的脱糖核心库,还需要额外补充脱糖内部实现类的保留规则:
-keep class j$.time.** { *; }
- 建议将脱糖核心库升级到最新稳定版,旧版本存在部分序列化相关的已知缺陷,修改依赖声明如下:
dependencies { coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4" }
注意:添加完规则、修改依赖后,先执行clean任务清理旧构建缓存,再重新编译Release包验证,避免缓存的旧混淆产物导致问题复现。
内容的提问来源于stack exchange,提问作者goemic
相关产品推荐
相关产品推荐

