最近使用fastjson来做json数据的解析,发现APK使用了签名和混淆打包出来之后,解析的javabean的字段是没有值的,于是开始定位问题:
1.没使用打包签名和混淆之前使用fastjson解析的javabean是可以拿到值的;
2.使用签名和混淆之后,使用fastjson解析值就是空了;
3.问题定位出来了:fastjson在混淆之后解析出问题了。
于是开始去fastjson’官方找混淆相关的代码,如下:
-dontskipnonpubliclibraryclassmembers
-dontskipnonpubliclibraryclasses
//这句话起不到作用,在android studio生成的javabean中
-keep class * implements java.io.Serializable { *; }
-keepattributes *Annotation
-keepattributes Signature
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
加入这些混淆代码之后,重新编译打包,出来接口还是一样的。这使我很郁闷。但是对于程序猿来说,就喜欢啃硬骨口。然后就google各种答案。然而很多都是跟我这个差不多千篇一律。
突然灵光一闪,我认为可以参考下gson的混淆。既然都是第三方json解析工具。混淆也应该差不多的。
然后就去查看gson解析的
-keepattributes Annotation
-keepattributes EnclosingMethod
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.* { ; }
**//com.xx.xx.xx.bean 解释:需要忽略不混淆的javabean
-keep class com.xx.xx.xx.javebean** { *; }
结果如下:
于是想着,既然是解析javabean出了问题,那应该fastjson和json一样,使用
**//com.xx.xx.xx.bean 解释:需要忽略不混淆的javabean
-keep class com.xx.xx.xx.javebean** { *; }
应该可以的。
然后立马做实验
等到的结果如下:
从结果中看出,加入如下代码可以彻底解决fastjson混淆各种问题
**//com.xx.xx.xx.bean 解释:需要忽略不混淆的javabean
-keep class com.xx.xx.xx.javebean** { *; }
下面贴完整代码,希望能帮助更多的人节约时间
“`
-dontskipnonpubliclibraryclassmembers
-dontskipnonpubliclibraryclasses
-keep class * implements java.io.Serializable { *; }
-keepattributes *Annotation
-keepattributes Signature
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.* { ; }
//需要忽略混淆的javabean的包名或者类
-keep class com.ling.fast.bean** { *; }
其实还有另外一种优雅的javabean忽略混淆方式如下:
http://blog.youkuaiyun.com/dbs1215/article/details/53358406