ProGuard的Android和改装2转换器Gson



我在项目中使用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>;
}

相关内容

  • 没有找到相关文章

最新更新