项目中用了很多反射,所以在混淆时就要注意了。以前没怎么用,然后就在网上搜了一堆教程。看过之后,模模糊糊。今天就开始自己试一下,首先根据网上的方法补上不混淆的类。顺利打包后,没报错。一阵暗喜,也不是很难嘛。然后运行,秒退。。。。一下就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,是我遇到关于混淆写得比较详细的一篇了。感谢。