首页 文章

Kotlin:ProGuard会删除属性属性

提问于
浏览
3

TL;DR :启用proguard后,使用反射时,我的属性看起来是私有的,不可为空的,没有注释,尽管proguard配置应该保留所有这些属性 .

我有一些简单的 data class es与公共属性在我的Android应用程序中作为数据模型 . 稍后,当对所述类进行泛型[de]序列化时,我会像这样过滤属性列表:

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

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

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

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

之前我试过这个,结果相同:

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

为什么/如何影响 property 可见性?我应该以某种方式修改配置吗?或者我在这里错过了其他什么?


UPDATE :看起来可见性不是唯一的 . prop.returnType.isMarkedNullable 也不起作用,它为声明为nullable的属性返回 false . 注释也似乎迷失了,尽管我要求proguard保留它们 . 有什么方法可以解决这个问题吗?它几乎让我的工作2周无用......

1 回答

  • 4

    感谢@yole在问题评论中的建议,我已经能够完成这项工作 . 尽管我的类被配置为由ProGuard保存,但它从它们中删除了 kotlin.Metadata 注释 . 这些注释是Kotlin存储我失踪的所有属性的地方 . 解决方案是阻止ProGuard删除它们,添加到配置:

    -keep class kotlin.Metadata { *; }
    

    (在旁注:默认配置中没有包含它's weird that it',至少如果您使用的是 kotlin.reflect.full 包 . 或者至少它应该在文档中的某处清楚地提到......)

相关问题