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
包,或者至少应该在文档中的某处清楚地提到它)