Android发布构建(minify开启、非debuggable)异常排查求助
排查发布版本minify导致API字段为空的思路
确认JSON实体类的注解是否完整
minify会重命名未加注解的字段,导致JSON解析框架匹配不上API返回的key。检查你的实体类:
- 给每个对应API返回的字段加上解析框架的固定注解,比如Gson用
@SerializedName("真实字段名"),Fastjson用@JSONField(name="真实字段名") - 要是字段只在解析时用、没在代码里直接调用,minify可能会把它删掉,这种情况必须确保字段被保留
检查混淆规则文件(proguard-rules.pro)
- 给实体类所在包添加保留规则,比如:
或者更精准地保留带解析注解的字段:-keep class com.yourapp.model.** { *; }-keepclassmembers class com.yourapp.model.** { @com.google.gson.annotations.SerializedName <fields>; } - 别忘了解析框架本身的类也要保留,比如Gson、Retrofit这些:
-keep class com.google.gson.** { *; } -keep class retrofit2.** { *; }
查看混淆映射文件找线索
编译release版本后,app/build/outputs/mapping/release/mapping.txt里记录了混淆前后的名称对应关系:
- 找出出问题的实体类,看字段是不是被重命名了,或者直接被标记为removed
- 根据映射结果调整混淆规则,把需要的字段/类保留下来
临时开启debuggable=true调试
在release构建类型里设debuggable true,同时保持minify开启:
- 这样可以用Logcat打印解析后的实体对象,或者直接用调试器查看哪些字段为空,对应混淆后的名称是什么,快速定位问题点
排查其他编译优化设置
- 看看
build.gradle里有没有开shrinkResources,临时关掉试试,有时候资源缩减会和代码缩减联动出问题 - 现在Android默认用R8替代ProGuard,R8的规则和ProGuard有差异,要是用了R8,确保你的混淆规则兼容它的优化逻辑
验证API返回的一致性
别忽略环境差异:确认release版本请求的API地址、参数和debug版本完全一致,有没有生产环境和测试环境返回字段不一样的情况
内容的提问来源于stack exchange,提问作者Mirco
相关产品推荐
相关产品推荐

