【Android】混淆导致json解析出错

Android Strudio推出Gson Format插件以后,Gson Format可以为开发者创建我们的json文件对应的java对象模板,这使得Json解析显得特别简单,大大降低了编程人员的时间成本。但是一不小心就会出现这样的问题:

在debug状态编译的时候程序按照我们设想的去解析数据,但是切换到release打包生成的app却解析得到错误的json

其实是因为在打release包的时候,我们通常需要用到混淆操作,在混淆的时候,如果没有在混淆文件中keep掉我们的JavaBean类,那么这个类中的变量可能会被混淆成其他内容,导致在json解析的时候难以准确解析。
解决的办法是找到工程目录下的 proguard-project.txt 混淆配置文件,在文件中添加不需要混淆的类或者包名即可,取消混淆的命令如下:

-keep class com.aaa.bbb.** {*;} //取消com.aaa.bbb这个包名路径下所有类和子包的混淆
-keep public class com.aa.bb.Test { *; }//取消混淆Test类
-keep public class * extends com.a.b.test { *; }//取消混淆Test类的子类
-keep public class **.*model*.** {*;}//取消所有类名中包含了“model”的类及其成员的混淆
-keep class * implements com.aa.bb.lgInterface { *; }//取消lgInterface接口实现类的混淆
-keep class com.a.b.Test$* {
      *;
}//取消某个类的内部类的混淆

一般情况下,以下几种内容是不能混淆的,否则都会导致本文中谈到的这种错误:

1.jni方法不可混淆,因为这个方法需要和native方法保持一致:

-keepclasseswithmembernames class * { # 保持native方法不被混淆    

    native <methods>;

}

2.反射用到的类不混淆(否则反射可能出现问题);

3.AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的。

4,与服务端交互时,使用GSON、fastjson等框架解析服务端数据时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象(就是本文中所说的情况)。

5,使用第三方开源库或者引用其他第三方的SDK包时,如果有特别要求,也需要在混淆文件中加入对应的混淆规则;

6,有用到WebView的JS调用也需要保证写的接口方法不混淆,原因和第一条一样。

7,Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常:

-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆            

    public static final Android.os.Parcelable$Creator *;

}

8.使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用,见第二条规则。

-keepclassmembers enum * {  

    public static ** values();  

    public static ** valueOf(java.lang.String);  

}

更多混淆规则,可以参考这篇文章:传送门

感谢阅读!

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值