android:对 ZonedDateTime 进行脱糖会导致 TimeOffset 为 null

android: Desugaring of ZonedDateTime results in TimeOffset being null

提问人:goemic 提问时间:6/8/2022 最后编辑:goemic 更新时间:6/29/2022 访问量:457

问:

我正在尝试通过脱糖从 ThreeTen Android Backport 迁移到 java.time。在调试版本上,这可以完美地工作,但是在发布版本()上,我在运行时遇到一个奇怪的错误。minifyEnabled = true

序列化 ZonedDateTime 后(在 Intent 中传递 Bundle),ZonedDateTime 缺少 TimeOffset:

以前:2022-06-07T02:00+02:00

后:2022-06-07T02:00null

我正在使用 gradle 版本 7.2.1 (AGP 7.3.3) 与上面列出的 android 文档中的基本备份相结合。(将其更改为 Java 11 并不能解决问题)

android {
  ...

    compileOptions {
        // Flag to enable support for the new language APIs (java.time)
        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"
}

我是否遗漏了任何配置(例如在 proguard-rules 中)?如何解决此问题?

更新 1: 09.06.2022 这是该问题的最小可重现示例。请记住,这只会发生在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"
安卓 java-time android-r8 jdk-脱糖 threetenabp

评论

0赞 Joachim Sauer 6/9/2022
你能提供一个最小的可重复的例子吗?首先创建哪个代码?ZonedDateTime
0赞 sgjesse 6/14/2022
在 R8 问题跟踪器上打开了 issuetracker.google.com/235932415

答:

1赞 goemic 6/29/2022 #1

一般问题是desugar_jdk_libs“除了集合之外,不支持在脱糖库中使用默认的 java 序列化程序进行序列化”。

此问题已在库的 1.1.6 版中得到解决:

coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.6"

现在,当启用缩小时,一切都按预期唤醒!