用于Android的ProGuard和Retrofit2转换器Gson?

ujv3wf0j  于 2022-11-06  发布在  Android
关注(0)|答案(5)|浏览(195)

我在我的项目中使用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'

Android中的retrofit 2:converter-gson是否有新的推荐ProGuard配置?

gz5pxeao

gz5pxeao1#

您要么希望保留与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可以使用注解来获取每个字段的正确名称

m2xkgtsf

m2xkgtsf2#

使用@Keep注解JSON模型类。

jhkqcmku

jhkqcmku3#

使用android @在您想要的类上保留注解,如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 *
enyaitl3

enyaitl34#

在我的例子中,我在使用莫希for JSON with Retrofit,但问题是相同的。它在调试时工作正常,但在使用ProGuard构建后,使用该模型的RecyclerView崩溃并出现NullPointerException,因为列表中充满了空的模型对象,因为Moshi无法识别任何字段。我认为Gson也发生了完全相同的情况。
一种解决方案是使用相应的序列化名称来注解每个字段:

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

这样,ProGuard就可以在不中断转换的情况下混淆变量名。
另一个解决方案是像Dodge建议的那样,在proguard-rules.pro文件中添加一个“keep”选项

-keep public class com.example.model.User
jtw3ybtb

jtw3ybtb5#

如果您使用jsonschema 2 pojo,则每个字段都使用
@序列化名称(字段)
只需将其添加到您的www.example.com中proguard-rules.pro,即可将每个字段名保留为@SerializedName。

-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

相关问题