ProGuard for Android和Retrofit2 Converter Gson?

时间:2016-07-28 09:05:17

标签: android gson proguard retrofit2 android-proguard

我在我的项目中使用ProGuard,但它在新的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'

是否有针对retrofit2推荐的新ProGuard配置:Android中的converter-gson?

4 个答案:

答案 0 :(得分:13)

您要么将要使用的类保留在gson中,要么使用@SerializedName注释。

选项1(保持等级)

// all classes in a package
-keep class com.example.app.json.** { *; }
// or a specific class
-keep class com.example.app.json.SpecificClass { *; }

选项2(使用@SerializedName):

public class YourJsonClass{
   @SerializedName("name") String username;

   public MyClass(String username) {
     this.username = username;
   }
 }

使用第二个选项proguard仍会混淆类和字段名称,但gosn可以使用注释为每个字段获取正确的名称

答案 1 :(得分:4)

使用@Keep注释您的JSON模型类。

答案 2 :(得分:0)

在我的情况下,我使用Moshi for JSON with Retrofit,但问题是一样的。它在调试中工作,但在使用ProGuard构建之后,使用该模型的RecyclerView与NullPointerException崩溃,因为列表中充满了空模型对象,因为Moshi没有识别任何字段。我认为Gson也会发生同样的事情。

一种解决方案是使用相应的序列化名称注释每个字段:

@Json(name="username") String username;

这样,ProGuard可以在不破坏转换的情况下对变量名称进行模糊处理。

另一种解决方案是添加&#34;保持&#34;道奇建议的选项,在proguard-rules.pro档案

-keep public class com.example.model.User

答案 3 :(得分:0)

在所需类(如authToken)上使用android @Keep批注

@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 *