调试模式下设置minifyEnabled为true后,API调用不正常。

3
在 build.gradle 中启用 minifyEnabled true 后,就像下面这样:
 buildTypes {
    release {
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
    debug {
        debuggable true
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

当我在minifyEnabled true的情况下进行API调用时,我虽然成功了,但某些参数的值发生了变化,与期望值不同。
而当我在minifyEnabled false的情况下进行API调用时,我得到了来自后端的实际值。
例如,在API响应中,我得到了一个名为isValidUser的布尔参数。其实际值是isValidUser=true,这是预期的结果,但我得到的却是isValidUser=false
请帮助我找出我的build.gradle文件中的问题所在。

1
你需要将你的DTO类放在Proguard中或使用Gson注解 @SerializedName。 - Payam Kokabi
是的,我使用了Gson注解@SerializedName。 - Arbaz.in
1
只需添加-keep class YOUR CLASS ** { *; }即可。 - Payam Kokabi
1
阅读此文章:https://medium.com/androiddevelopers/practical-proguard-rules-examples-5640a3907dc9 - Payam Kokabi
@PayamKokabi 我想以动态方式更改该行,当我更改包名称时,它将反映在proguard-rules.pro中。这是可能的吗? - Arbaz.in
显示剩余3条评论
3个回答

4
请具体说明哪个部分无法工作,但通常是从模型中排除它们在规则文件中的应用:
# Models
-keepclassmembers class com.example.models.** {*;}

# GSON
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

谢谢你的回答,我已经按照相同的方式操作了。现在我遇到了这个问题:我只是更改了我的包名,在 proguard-rules.pro 文件中,我们必须硬编码写入此文件中的某一行。是否有其他方法可以在更改包名时更改该行? - Arbaz.in
@Arbaz.in 很遗憾,这需要硬编码。 - Farouq Afghani

1
如果您使用@SerializedName并保留Gson,则无需保留类,尽管在一些罕见情况下需要同时执行。您可以使用以下Proguard规则来处理您的GSON,它应该有效: GSON Proguard

首先,我尝试使用@SerializedName,但该模型无法正常工作,然后我设置了Proguard规则,现在它可以正常工作了。感谢您的答案。 - Arbaz.in

1
在Payam Kokabi的帮助下,问题得到了解决。当我们在proguard-rules.pro文件中声明-keep class YOUR CLASS ** { *; }时,minifyEnabled true不会改变值。请注意保留HTML标签。

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