Proguard - 不要混淆 Kotlin 数据类

41
在我的项目中,我使用 AutoValue 来处理旧的模型类。我开始使用 Kotlin,并希望在我的Data层中使用数据类代替 AutoValue。我想要禁用所有Data类的混淆,但保留包中其他类的混淆。
有什么方法可以做到这一点吗?
我希望在我的Proguard文件中有类似以下的设置:
-keepclassmembers data class example.data_layer.** { *; }
4个回答

84
为了解决问题,我将模型类移动到 模型包 中,并为该包添加了新的ProGuard规则。
-keep class com.company.myfeature.model.** { *; }

另一种解决方案是使用支持库中的@Keep注释来为该类禁用混淆:

@Keep
data class MyRequestBody(val value: String)

使用@Keep可能会导致问题,因为很容易忘记为新类添加它。

希望将来能有一种方法,通过一个ProGuard规则禁用包中所有Data class的混淆,而无需为model class创建子包。


2
我不希望在所有的“数据类”上出现混淆。 - Tobias
5
如果您使用了@Keep并且有嵌套的数据类,请不要忘记对每个数据类添加@Keep注解。 - Esdras Lopez
3
正如您所提到的,使用一个Java包含语句[-keep class com.company.myfeature.model.** { *; }]只适用于Java,而在Kotlin中不起作用。请问您能否帮我解决这个问题?谢谢。 - Mahesh Kavathiya
我不明白为什么它不能工作。Proguard 对 Java 和 Kotlin 的工作方式相同。你需要 Proguard 帮助 - 搜索其他与你的问题相关的问题。 - Mario Kutlev
@保持工作很好,谢谢! - Konstantin Konopko

4

@Keep注解虽然可用,但另一个选择是向属性添加@SerializedName注解:

data class SomeDataClass(
    @SerializedName("prop1") val PropertyOne: String, 
    @SerializedName("prop2") val PropertyTwo: Boolean
)

2
你能解释一下 @SerializedName 是什么以及它如何解决问题吗? - user1114
2
这不会起作用。要么使用 @Keep,要么需要添加 proguard 规则告诉 proguard 不要混淆数据类。 - silwar

3

我不确定保留整个数据类是否好。但是如果必须要这么做,下面的proguard规则可以解决问题。 然而,这只是一种权宜之计。我建议您慎重考虑。

-keepclasseswithmembers class example.data_layer.** {
    public ** component1();
    <fields>;
}

我这里有一篇更详细的文章:如何让Proguard保留Kotlin数据类


3
您的个人资料显示您与所链接的文章有关联。在没有透露这篇文章是您自己写的情况下链接到自己的东西被认为是Spam(垃圾信息)在Stack Overflow上。请参阅:何谓"好的"自我推广?关于自我推广的一些提示和建议。我已经编辑了您的帖子以解决这个问题,并希望您在今后能够考虑这个问题。 - Samuel Liew
1
@SamuelLiew 哦..我不知道那个。以后我一定会遵循你的教导。感谢你的教诲。 - jeonghyeon kim

0
我用@Keep注解解决了我的问题,适用于所有解析API响应数据的模型类。
@Keep 数据类MyClass()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接