混淆后运行报错

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

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

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

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

-keep public class * extends android.support.v4.app.Fragment

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

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

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

你可能感兴趣的:(混淆后运行报错)