Release构建开启混淆后JSON转List返回空数组问题排查
问题根源
这个问题我之前也踩过坑——完全是Proguard混淆导致Gson无法正确映射你的MyList实体类。当Release构建开启minifyEnabled true时,Proguard会把代码里的类名、字段名压缩成无意义的短标识符(比如把topic改成a),而Gson是靠类字段名和JSON里的key一一对应来解析数据的,混淆后字段名不匹配,自然解析不出内容,返回空数组。
解决办法
给你几个实用的解决方案,选适合你的就行:
方法1:给实体类加Gson注解(推荐)
直接在MyList类和它的字段上添加注解,明确告诉Gson映射关系,同时防止类被混淆:
import com.google.gson.annotations.SerializedName; import androidx.annotation.Keep; // @Keep 告诉Proguard不要混淆这个类和它的成员 @Keep public class MyList { // @SerializedName 指定JSON里的key和类字段的对应关系 @SerializedName("topic") private String topic; @SerializedName("subMessage") private String subMessage; @SerializedName("people") private List<People> people; // 如果People是嵌套实体类,同样要加注解或排除混淆 // 构造方法、getter/setter按需添加 }
这种方式最稳妥,即使后续字段名修改,只要注解对应上JSON key就不会出问题。
方法2:在Proguard规则里添加排除规则
如果不想给每个实体类加注解,直接在proguard-rules.pro文件里配置,让Proguard放过你的实体类和Gson核心类:
# 保留Gson的核心组件不被混淆 -keep class com.google.gson.** { *; } -keep class com.google.gson.annotations.** { *; } # 替换成你自己的实体类所在包名,保留该包下所有类不被混淆 -keep class com.yourapp.models.** { *; } # 必须保留注解和泛型签名,否则Gson处理泛型列表会出问题 -keepattributes Signature -keepattributes *Annotation*
方法3:针对序列化的通用规则
如果你的实体类实现了Serializable接口,还可以加上这条规则,确保序列化相关的信息不被混淆:
-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); }
额外提醒
- 别忘了处理嵌套的实体类!比如
people字段对应的People类,也要做同样的混淆排除,不然嵌套列表依然会是空的。 - 调试Release构建时,可以临时把
debuggable true加上,这样你就能在Release模式下查看混淆后的类结构,确认问题是否解决。
内容的提问来源于stack exchange,提问作者user9765778
相关产品推荐
相关产品推荐

