所谓本地开发,测试稳得一批,一到线上就抽风就是这样
在 Android 打包成 App release 的时候,配置了混淆功能,导致无法正常解析
主要原因是:客户端中的 JavaBean 与 服务端返回的 JavaBean 的字段 key 需保持一致,才可正常的解析。
而如有使用混淆编译功能的话,它会全部给你改成了 a/b/c/d 类似的字符串,这就与服务端返回的 key 不一致,导致无法进行拆包获取
举例
以下是一个正常的 JSON 格式
{ "msg": "操作成功!t", "code": 0, "Data": { "user": { "JSESSIONID": "66672c22-fc3c-4f05-a427-675aaafc9d2b", "id": 1, "status": 1, "userName": "payne.zhuang" } } }
被混淆后,获取到的数据变成了如下
{ "c": "cGF5bmUwMC4u" }
这就懵逼了,混淆成功,导致获取数据取不到。
解决方法
在混淆配置 proguard.cfg
中,Gson 进行过滤本身的 JavaBean class
##---------------Begin: proguard configuration for Gson ---------- # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. -keepattributes Signature # For using GSON @Expose annotation -keepattributes *Annotation* # Gson specific classes -dontwarn sun.misc.** #-keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { ; } # 这一句很重要,需要配置成自己的 entity 包路径 -keep class com.izpan.app.entity.** { *; } # Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory, # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) -keep class * extends com.google.gson.TypeAdapter -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer # Prevent R8 from leaving Data object members always null -keepclassmembers,allowobfuscation class * { @com.google.gson.annotations.SerializedName ; } ##---------------End: proguard configuration for Gson ----------
如有多个包路径,需要配置多个
再去打包就妥了。