混淆后运行报错

项目中用了很多反射,所以在混淆时就要注意了。以前没怎么用,然后就在网上搜了一堆教程。看过之后,模模糊糊。今天就开始自己试一下,首先根据网上的方法补上不混淆的类。顺利打包后,没报错。一阵暗喜,也不是很难嘛。然后运行,秒退。。。。一下就sb了。错在哪都不晓得。换了个手机连上AS,运行,终于发现空指针异常,立马就发现containerField = null了,

Field containerField = ReflectionUtil.getField(getFragmentManager().getClass(), "
mContainer
")

那必然是因为混淆,导致mContainer属性名变了,然后定位到FragmentManager真有这么个,然后用了keep,keepclasseswithmembers,keepclassmembers等等不混淆FragmentManager类,然而并没有什么乱用。再去看哈,wc...是FragmentManagerImpl的属性,用改成FragmentManagerImpl。以为离成功很近了,现实依然残酷。

突然想起可以去查混淆后的映射文件,果然改成p了。Fragment的mContainer却没有混淆,我尝试跟Fragment一样的设置如下:

<img src="https://img-blog.csdn.net/20160911153605197?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<span style="font-family: Consolas, 'Courier New', Courier, mono, serif;">-keep public class * extends android.support.v4.app.Fragment</span>

-keep public class android.support.v4.app.FragmentManagerImpl

结果仍然没用,mContainer就是要混淆,搞了几个小时,实在无语了,突然灵机一动,既然改不了你,我改还不成吗,反正混淆了就是最后的结果了,直接在代码里面将mContainer改成p,成了!!!完美运行。

参考了Android ProGuard 混淆 详解http://blog.csdn.net/chen930724/article/details/49687067,是我遇到关于混淆写得比较详细的一篇了。感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值