问题
最近在自己项目中遇到一个崩溃问题,debug版本不会,release版本会!!
一开始有点蒙,还是老老实实根据操作步骤以及崩溃log,先定位导致崩溃的代码位置。原来是某个JavaBean
在Gson
解析json
格式数据后,继续把这个对象给后面的业务逻辑使用然后崩溃了。根据打印log分析json
字符串是正常啊?尴尬...
于是开始google,功夫不负有心人,有人遇到类似问题提到是混淆后JavaBean
类的字段名称会变成a、b、c等之类的字符串,与json
字符串中的key
不一致了。
ok,原来是混淆问题,那就修改proguard-rules.pro
文件!
解决
来看下混淆文件proguard-rules.pro
文件,修改如下:
-keep class com.google.gson.examples.models.** { *; }
-keep interface com.google.gson.examples.models.** { *; }
-keep class com.google.gson.examples.upgrade.internal.VersionInfo {*;}
改好之后,重新打一个release包测试问题解决。反编译apk包发现这些JavaBean
类没有被混淆,正是我们想要的。
总结
问题主要是使用了混淆编译的方式进行apk打包(其中不混淆编译进行apk打包则一切正常),因为JavaBean
(实体类)的字段名称必须与服务端返回json
字符串中的key
要一致,才能进行解析,而混淆编译之后,客户端代码中的JavaBean
(实体类)的类名与其字段名称全部变成了a、b、c、d等等字符串,这与服务端返回的json
字符串中的key
不一致,导致解析失败。
所以,解决的办法是:在进行混淆编译进行打包apk的时候,过滤掉存放所有JavaBean
(实体类)的包不进行混淆编译。