【问题标题】:Proguard/R8 is minifying @JsonProperty annotation names in Kotlin data class for JacksonProguard/R8 正在为 Jackson 缩小 Kotlin 数据类中的 @JsonProperty 注释名称
【发布时间】:2019-11-09 06:01:36
【问题描述】:

我有一些用于 Retrofit2 的类,并由 Jackson 序列化。

@JsonIgnoreProperties(ignoreUnknown = true)
class GetUserRequest(
    @JsonProperty("user_id")
    var userId: String? = null
)

它们在调试构建中工作,但是当我在启用 proguard 或 R8 缩小的情况下进行发布构建时,它会缩小类变量(如预期的那样),但也会缩小 @JsonProperty 生成的任何代码,从而导致发送网络请求用 json 像 { "a": "123" } 而不是 { "user_id": "123" }

我已经包含了 jackson 对 kotlin 的支持 实施“com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9” 实现“com.squareup.retrofit2:converter-jackson:2.6.0”

我有一些适用于我的 java 类模型对象的 proguard 规则。

-keep class com.fasterxml.jackson.databind.ObjectMapper {
    public <methods>;
    protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
    public ** writeValueAsString(**);
}
-keep class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
     @com.fasterxml.jackson.annotation.JsonProperty *;
}

-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class kotlin.Metadata { *; }

我需要添加哪些 proguard 规则以使 Proguard 不会缩小 json 属性?

我不想只排除模型包中的所有内容。

【问题讨论】:

  • 可能类似于:-keepclassmembers class * { @com.fasterxml.jackson.annotation.JsonProperty *; }
  • 我的 -keep class * { JsonProperty } 不是已经涵盖了
  • 我的问题中的proguard 已经包含了链接问题的答案。所经历的症状也不同。链接问题的 @JsonAnnotation 属性被忽略,而我的字段本身被重命名。
  • 在我看来问题是注释 @JsonProperty("user_id") 成为 GetUserRequest 的构造函数参数上的注释,而 not 是生成的 userId 上的注释场地。如何更改类的声明以具有带有 @JsonProperty("user_id") 注释的显式 userId 字段。

标签: android kotlin jackson retrofit2 proguard


【解决方案1】:

我遇到了同样的问题。在您的示例中像这样解决它:

@JsonIgnoreProperties (ignoreUnknown = true)
class GetUserRequest (
     @field:JsonProperty ("user_id")
     var userId: String? = null
)

像这样来自 Kotlin 数据类的注释不会进入 java 代码,因为就像 cmets 中的 sgjesse said 一样,在您的示例中,注释应用于构造函数参数,而不是字段。

你可以阅读更多关于@field:Annotationhere的信息。

附注:

就我而言,这足以将对象序列化为 JSON(以发出请求)。但是,当收到响应时,这在反序列化的情况下不起作用。

我只需要为所有字段添加默认参数。但是你的例子中已经有了它,我只是为那些将面临同样问题的人写这篇文章。

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2018-04-19
    • 1970-01-01
    • 2018-05-20
    • 2017-10-24
    • 2019-01-24
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多