2016-07-28 113 views
4

我在我的项目中使用ProGuard,但在新的Gson()。toJson(Request)中给出了错误的数据;ProGuard for Android和Retrofit2 Converter Gson?

我得到了放

{"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.** { *; } 

{"a":"manage","b":"689184d4418b6d975d9a8e53105d3382","c":"10","d":"76"} 

,而不是和我使用

compile 'com.squareup.retrofit2:converter-gson:2.0.0' 

是否有推荐的ProGuard配置用于retrofit2:converter-gson in Android?

+0

最简单的将是保持你婉与GSON使用的类。否则你可能想看看gson是否有一个注释来给一个字段命名 - 这是我在我的应用程序中使用jackson的方式。 – Dodge

+0

如何保持班级..任何规则 – praj

+0

看到我的回答:) – Dodge

回答

9

你要么保留你正在使用的类与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可以使用注释为每个字段获取正确的名称

3

@Keep注释您的JSON模型类。

0

就我而言,我使用Moshi进行JSON改造,但问题是一样的。它在调试中起作用,但在使用ProGuard构建之后,使用该模型的RecyclerView因NullPointerException而崩溃,因为该列表中充满了空模型对象,因为Moshi没有识别出任何字段。我认为Gson也会发生同样的情况。

一种解决方案是标注各个领域与其对应的序列化的名字:

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

这样的ProGuard可以混淆变量名没有打破转换。

另一种解决方案是增加一个“保存”选项像道奇建议,在proguard-rules.pro文件

-keep public class com.example.model.User