ProGuard for Android和Retrofit2 Converter Gson?

pra*_*raj 8 android proguard gson android-proguard retrofit2

我在我的项目中使用ProGuard,但它在新的Gson().toJson(Request)中提供了错误的数据;

我正在退出

{"a":"manage","b":"689184d4418b6d975d9a8e53105d3382","c":"10","d":"76"}
Run Code Online (Sandbox Code Playgroud)

代替

{"username":"manage","password":"689184d4418b6d975d9a8e53105d3382","value":"10","store":"76"}
Run Code Online (Sandbox Code Playgroud)

我的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.** { *; }
Run Code Online (Sandbox Code Playgroud)

而我正在使用

 compile 'com.squareup.retrofit2:converter-gson:2.0.0'
Run Code Online (Sandbox Code Playgroud)

是否有一个新推荐的ProGuard配置用于retrofit2:在Android中的converter-gson?

Dod*_*dge 14

你要么想用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可以使用注释来获取每个字段的正确名称


Eug*_*nec 5

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


Ali*_*adi 5

在您想要的类(如 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) {}
Run Code Online (Sandbox Code Playgroud)

然后在 ProGuard 中添加以下行:
如果使用 androidx

-keep @androidx.annotation.Keep public class *
Run Code Online (Sandbox Code Playgroud)

别的

 -keep @android.support.annotation.Keep public class *
Run Code Online (Sandbox Code Playgroud)