You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的异常表现。

修复方案
  1. 在模块的混淆配置文件(通常为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.** { *; }
  1. 建议将脱糖核心库升级到最新稳定版,旧版本存在部分序列化相关的已知缺陷,修改依赖声明如下:
dependencies {
    coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4"
}

注意:添加完规则、修改依赖后,先执行clean任务清理旧构建缓存,再重新编译Release包验证,避免缓存的旧混淆产物导致问题复现。


内容的提问来源于stack exchange,提问作者goemic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 04:48:23