我在我的项目中使用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配置?
5条答案
按热度按时间gz5pxeao1#
您要么希望保留与gson一起使用的类,要么希望使用
@SerializedName
注解。选项1(保留类别)
选项2(使用
@SerializedName
):使用第二个选项,proguard仍然会混淆类名和字段名,但gosn可以使用注解来获取每个字段的正确名称
m2xkgtsf2#
使用
@Keep
注解JSON模型类。jhkqcmku3#
使用android @在您想要的类上保留注解,如authToken
然后在ProGuard中添加以下行:
如果使用androidx
埃尔塞
enyaitl34#
在我的例子中,我在使用莫希for JSON with Retrofit,但问题是相同的。它在调试时工作正常,但在使用ProGuard构建后,使用该模型的RecyclerView崩溃并出现NullPointerException,因为列表中充满了空的模型对象,因为Moshi无法识别任何字段。我认为Gson也发生了完全相同的情况。
一种解决方案是使用相应的序列化名称来注解每个字段:
这样,ProGuard就可以在不中断转换的情况下混淆变量名。
另一个解决方案是像Dodge建议的那样,在
proguard-rules.pro
文件中添加一个“keep”选项jtw3ybtb5#
如果您使用jsonschema 2 pojo,则每个字段都使用
@序列化名称(字段)
只需将其添加到您的www.example.com中proguard-rules.pro,即可将每个字段名保留为@SerializedName。