如何跳过基础包中的改造 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 模型?的主要内容,如果未能解决你的问题,请参考以下文章
如何访问数组改造 2 / android studio 中的对象“播放器”