que*_*zak 3 android proguard kotlin
TL; DR:启用了proguard时,尽管使用了应保留所有这些属性的proguard配置,但在使用反射时,我的属性看起来是私有的,不可为空且没有注释。
我有一些data class具有公共属性的简单es,可以在我的Android应用中用作数据模型。稍后,当对所述类进行泛型[反]序列化时,我会像这样过滤属性列表:
val properties = instance::class.memberProperties
.filter { it.visibility == KVisibility.PUBLIC } // && some other conditions, unrelated here
.filterIsInstance<KMutableProperty<*>>()
Run Code Online (Sandbox Code Playgroud)
它可以在我的调试版本上正常工作(我是说它选择了我想要的属性)。但是,在进行发布构建时,如果激活了 proguard,则结果为空。为了检查原因,我记录了有关一个类的属性的所有相关信息-证明了它们的visibility字段读取PRIVATE(所有其他属性与调试版本相同)。
我已经在proguard config中设置了一行来保留所有模型:
-keepclassmembers class * extends com.models.package.name.BaseModel { *; }
Run Code Online (Sandbox Code Playgroud)
我之前尝试过此方法,但结果相同:
-keep class com.models.package.name.** { *; }
Run Code Online (Sandbox Code Playgroud)
保护者为何/如何影响财产可视性?我应该以某种方式修改配置吗?还是我在这里想念其他东西?
更新:似乎并不是唯一的可见性。prop.returnType.isMarkedNullable也不起作用,它返回false声明为可空的属性。即使我要求proguard保留注释,注释也似乎会丢失。有什么办法可以解决此问题?这几乎使我的工作两周没用了...
感谢@yole提出问题的建议,使我能够完成这项工作。即使将我的类配置为由ProGuard保留,它也会kotlin.Metadata从它们中删除注释。这些注释是Kotlin存储我所缺少的所有属性的地方。解决方案是防止ProGuard删除它们,将其添加到配置中:
-keep class kotlin.Metadata { *; }
Run Code Online (Sandbox Code Playgroud)
(附带说明:奇怪的是,它不包含在默认配置中,至少在您使用kotlin.reflect.full软件包的情况下。或者至少应该在文档的某处清楚地提及它。)
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |