安卓android中使用混淆proguard产生的bug

问题一:使用gson包解析数据时,出现missing type parameter异常
程序中用到了gson的new typeToken,结果打包成apk发布时,发现抛出异常,但不通过打包apk时发现一切正常,百


思不得其解,最初怀疑没有将gson-1.7.1.JAR打包进去,后来经过测试发现gson的其他方法经过打包也能正常运行


,最后上网找了2天,终于在google gson论坛中找到了解决方法。
第一种:在 proguard.cfg中添加
-dontobfuscate
-dontoptimize


第二种:在 proguard.cfg中添加
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature


# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }


# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
这两种方法都测试可行,第一个方法没有混淆编译,第二个方法能够混淆编译
问题二:
反射类不能进行混淆编译,需加入
-keep class com.test.model.response.** {*;}
问题三:
android辅助jar包异常,在proguard.cfg中加入
-dontwarn android.support.v4.**
-keep class android.support.v4.** {*;}
问题四:(同1)
类型转换错误,因为我用的泛型,所以在调用某些方法的时候,会出现这种错误,后面在混淆配置文件加了一个过


滤泛型的语句,如下。


-keepattributes Signature
过后,就没有出现类似的类型转换错误。


问题五:空指针异常,这个错误是我对比前面的错误来说,所用的时间比较短,开始是找不到方法到底是哪个(原


因是上面提到的混淆后方法名相同),所以就把这个类里面的所有方法都过滤掉,这样我没用多少时间,也就找到


了具体的方法,可还是不明白原因,后面发现了其中的一个if判断,我利用反射筛选方法,关键字是“get”,突然


我就震精了,大叫一声——soga,原来我 model的 set/get方法名全部都被混淆了,所以筛选不到方法,返回的也


就是null值,自然下面用到这个方法的返回值就会抛出空指针异常。


解决方法:把 model包下面的所有类,全部过滤掉。


总结:如要用到反射,反射一般就会利用到泛型,所以必须要把泛型的全部过滤掉,如果有根据变量名或者方法名


判断的,记得所在的类需过滤掉,之中还有用到 annotation的地方,要加入一行代码,如下:


-keepattributes *Annotation*
这样就能过滤掉所有的annotation,否则也会抛出空指针异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值