Kotlin:ProGuard擦除属性属性

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

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

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

它正常工作在我的调试版本(我的意思是选择我想要的属性)。 但是,在执行释放构建时,如果proguard处于活动状态, 则结果为空 。 为了检查原因,我记录了关于一个类的属性的所有相关内容 – 显示它们的visibility字段读取PRIVATE (并且所有其他属性在调试版本上保持不变)。

我已经有一个线程在proguard配置保持所有的模型:

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

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

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

为什么/ proguard如何影响房屋的可见度? 我应该修改配置吗? 还是我在这里错过了别的东西?


更新 :似乎知名度不是唯一的事情。 prop.returnType.isMarkedNullable也不起作用,对于声明为空的属性返回false 。 注释也似乎迷路了,尽管我问proguard要保留它们。 有什么办法可以解决这个问题吗? 这几乎使我的工作2周无用…

感谢@yole提出的评论意见,我已经能够做到这一点。 即使我的类被配置为由ProGuard保留,它kotlin.Metadata从中剥离kotlin.Metadata注释。 这些注释是Kotlin存储所有我缺少的属性的地方。 解决方法是防止ProGuard删除它们,添加到配置中:

 -keep class kotlin.Metadata { *; } 

(注意:奇怪的是,它不包含在默认配置中,至少如果你使用的是kotlin.reflect.full包,或者至少应该在文档中的某处清楚地提到它)