我在项目中使用ProGuard,但它在new Gson().toJson(Request)中给出了错误的数据;
我要离开
{"a":"manage","b":"689184d4418b6d975d9a8e53105d3382","c":"10","d":"76"}
而不是
{"username":"manage","password":"689184d4418b6d975d9a8e53105d3382","value":"10","store":"76"}
我的ProGuard规则
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
-dontwarn sun.misc.Unsafe
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclassmembers class rx.internal.util.unsafe.** {
long producerIndex;
long consumerIndex;
}
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
-keep class com.google.gson.** { *; }
-keep class com.google.inject.** { *; }
我正在使用
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
安卓系统中有没有新的推荐ProGuard配置用于retrofit2:converter gson?
您要么希望保留与gson一起使用的类,要么使用@SerializedName
注释。
选项1(保持等级)
//包中的所有类-保留类com.example.app.json.**{*;}//或特定类别-keep类com.example.app.json.SpecificClass{*;}
选项2(使用@SerializedName
):
公共类YourJsonClass{@SerializedName("name")字符串用户名;public MyClass(字符串用户名){this.username=用户名;}}
使用第二个选项,proguard仍然混淆类和字段名称,但gosn可以使用注释为每个字段获取正确的名称
使用@Keep
注释JSON模型类。
使用android@Keep注释您想要的类,如authToken
@Keep
data class AuthToken(
var access_token: String,
var token_type: String,
var expires_in: String,
var userName: String,
var issued: String,
var expires: String) {}
然后在ProGuard中添加以下行:
如果使用androidx
-keep @androidx.annotation.Keep public class *
其他
-keep @android.support.annotation.Keep public class *
在我的案例中,我使用Moshi进行JSON改装,但问题是一样的。它在调试中起作用,但在使用ProGuard构建后,使用该模型的RecyclerView因NullPointerException而崩溃,因为列表中充满了空的模型对象,因为Moshi无法识别任何字段。我认为Gson也会发生同样的事情。
一种解决方案是用相应的序列化名称对每个字段进行注释:
@Json(name="username") String username;
这样ProGuard就可以在不破坏转换的情况下混淆变量名。
另一个解决方案是在proguard-rules.pro
文件中添加Dodge建议的"保留"选项
-keep public class com.example.model.User
如果您使用jsonschema2pojo,则每个字段都用进行注释
@SerializedName(字段)
只需将其添加到proguard-rules.pro中,即可将每个字段名称保留为@SerializedName。
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}