Kotlin:ProGuard 擦除 properties 属性
Kotlin: ProGuard erases properties attributes
TL;DR:在启用混淆器的情况下,使用反射时,我的属性看起来是私有的、不可为空且没有注释,尽管混淆器配置应该保留所有这些属性。
我有一些具有 public 属性的简单 data class
es 作为我的 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
包。或者至少应该在文档中的某个地方清楚地提到它。 ..)
TL;DR:在启用混淆器的情况下,使用反射时,我的属性看起来是私有的、不可为空且没有注释,尽管混淆器配置应该保留所有这些属性。
我有一些具有 public 属性的简单 data class
es 作为我的 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
包。或者至少应该在文档中的某个地方清楚地提到它。 ..)