Kotlin:ProGuard 擦除 properties 属性

Kotlin: ProGuard erases properties attributes

TL;DR:在启用混淆器的情况下,使用反射时,我的属性看起来是私有的、不可为空且没有注释,尽管混淆器配置应该保留所有这些属性。

我有一些具有 public 属性的简单 data classes 作为我的 Android 应用程序中的数据模型。后来,在对上述 classes 进行通用 [反] 序列化时,我像这样过滤 属性 列表:

val properties = instance::class.memberProperties
        .filter { it.visibility == KVisibility.PUBLIC } // && some other conditions, unrelated here
        .filterIsInstance<KMutableProperty<*>>()

它在我的调试版本上正常工作(我的意思是它选择了我想要的属性)。但是,在执行 release 构建时,proguard 处于活动状态,结果为空。为了检查原因,我记录了关于一个 class 属性的所有相关内容——结果他们的 visibility 字段读取 PRIVATE(并且所有其他属性与调试版本相同).

我已经在 proguard 配置中有一行来保留所有模型:

-keepclassmembers class * extends com.models.package.name.BaseModel { *; }

我之前试过这个,结果一样:

-keep class com.models.package.name.** { *; }

Why/how Proguard 会影响 属性 可见性吗?我应该以某种方式修改配置吗?还是我在这里遗漏了其他东西?


更新:似乎可见性并不是唯一的。 prop.returnType.isMarkedNullable 也不起作用,它 returns false 对于声明为 null 的属性。注释似乎也丢失了,即使我要求 proguard 保留它们。有什么办法可以解决这个问题吗?它几乎使我 2 周的工作变得毫无用处...

多亏@yole 在问题评论中的建议,我才得以完成这项工作。尽管我的 类 配置为由 ProGuard 保留,但它从中删除了 kotlin.Metadata 注释。这些注释是 Kotlin 存储我丢失的所有属性的地方。解决方案是防止 ProGuard 删除它们,添加到配置:

-keep class kotlin.Metadata { *; }

(附带说明:它不包含在默认配置中很奇怪,至少如果您使用 kotlin.reflect.full 包。或者至少应该在文档中的某个地方清楚地提到它。 ..)