33

In my project I use AutoValue for my old model classes. I started using Kotlin and I want to use Data Classes instead of AutoValue. I want to disable the obfuscation for all Data classes in my Data layer but to keep obfuscating the other classes in the package.

Is there a way to do this?

I would expect to have something like this in my Proguard file:

-keepclassmembers data class example.data_layer.** { *; }
4

4 回答 4

67

为了解决这个问题,我将模型类移动到模型包并为包添加了新的ProGuard规则。

-keep class com.company.myfeature.model.** { *; }

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

@Keep
data class MyRequestBody(val value: String)

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

希望将来有一种方法可以使用一个ProGuard 规则来禁用包中所有数据类的混淆,而无需为模型类创建子包。

于 2017-09-11T13:17:57.730 回答
4

虽然@Keep注释有效,但另一种选择是添加@SerializedName到属性中:

data class SomeDataClass(
    @SerializedName("prop1") val PropertyOne: String, 
    @SerializedName("prop2") val PropertyTwo: Boolean
)
于 2019-11-07T01:54:41.280 回答
3

我不确定保持整个数据类是否好。但如果需要,下面的 proguard 规则将起作用。但是,这只是解决方法。我建议没有信心。请慎重考虑。

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

我这里有一篇文章有​​更详细的解释:How to make Proguard keep Kotlin data class

于 2020-02-09T07:54:15.910 回答
0

我为解析 api 响应数据的所有模型类使用 @Keep annotaion 解决了我的问题

@保持

数据类 MyClass()

于 2021-06-25T21:56:25.897 回答