如何跳过基础包中的改造 2 使用的 proguard 模型?

Posted

技术标签:

【中文标题】如何跳过基础包中的改造 2 使用的 proguard 模型?【英文标题】:How to skip proguard models used by retrofit2 that is on the base package? 【发布时间】:2017-11-12 09:49:00 【问题描述】:

我正在使用 Kotlin 和 Retrofit 2 编写应用程序。由于我使用 proguard,因此我遵循这里的规则:

https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-retrofit2.pro

此外,我还需要保护我的模型,如https://***.com/a/41136007/3286489中所述

如果我有我的模型在一个包中,它工作正常,我有-keep class com.elyeproj.wikisearchcount.model.** *;

package com.elyeproj.wikisearchcount.model

object Model 
    data class Result(val query: Query)
    data class Query(val searchinfo: SearchInfo)
    data class SearchInfo(val totalhits: Int)

但是,如果我将模型保存在基本包中,如下面的代码,但我不想保留整个包,即-keep class com.elyeproj.wikisearchcount.** *; ,因为这违背了 proguard 的目的

package com.elyeproj.wikisearchcount

object Model 
    data class Result(val query: Query)
    data class Query(val searchinfo: SearchInfo)
    data class SearchInfo(val totalhits: Int)

我怎样才能保留我的模型类?

我试过-keep class com.elyeproj.wikisearchcount.Model.** *; ,但没有用。

【问题讨论】:

【参考方案1】:

为什么不用注解@SerializedName 就不用担心混淆了? 您可以使用以下代码:

object Model 
    data class Result(@SerializedName("query") val query: Query)
    data class Query(@SerializedName("searchInfo") val searchinfo: SearchInfo)
    data class SearchInfo(@SerializedName("totalhits") val totalhits: Int)

【讨论】:

【参考方案2】:

经过进一步探索,我找到了答案

-keep class com.elyeproj.wikisearchcount.Model**  *; 

【讨论】:

代替这个,试试@Jc Miñarro 的回答。【参考方案3】:

对于仍然有这个问题的人......我在 Volley + Moshi 和现在的 Retrofit + Gson 上都遇到过这个问题,尽管这两个都不是问题。真正的问题是你的模型被混淆了,这是你想要防止的。为此,您有 3 个选项: @SerializedName 注释 正如 Jc Miñarro 建议的那样,使用 @SerializedName 注释您的参数,如下所示:

data class YourModel(
    @SerializedName("param1") val param1: String
)

@Keep 注释 另一种选择是在定义模型时使用 @Keep 注释:

@Keep
data class YourModel(...)

Proguard 规则 最后一个选项是在proguard-rules.pro 文件中定义“忽略”规则。例如忽略/api/models/ 中的所有模型:

-keep class com.yourapp.api.models.**  *; 

【讨论】:

以上是关于如何跳过基础包中的改造 2 使用的 proguard 模型?的主要内容,如果未能解决你的问题,请参考以下文章

使 Proguard 完全忽略包

如何访问数组改造 2 / android studio 中的对象“播放器”

如何在将 csv 文件加载到配置单元表时跳过页脚/拖车记录

使 rollApply() 跳过 n 步 - R

chart_flutter 包中的图中的 domainFn 和 measureFn 是啥?

JDK框架简析--java.lang包中的基础类库基础数据类型