我在我的项目中使用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?
答案 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 *