首页 > 代码库 > 安卓解决代码混淆与反射的冲突

安卓解决代码混淆与反射的冲突

     此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃。

解决办法

   1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:

   如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;

   2.过滤泛型:-keepattributes Signature

   3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}


接下来给大家讲一下反编译的方法步骤:

1.下载反编译工具:dex2jar 下载地址:http://download.csdn.net/detail/baiyuliang2013/7801333

2.解压后如图:


3.将你混淆后的APK安装包由.apk改为.zip;

4.解压.zip,将其中的classes.dex文件提取出来放进dex2jar文件夹中,如图:


5.调出cmd命令,并定位到dex2jar文件夹位置,如图:


6.定位后,在cmd中输入:dex2jar.bat classes.dex,然后按enter键,如图:


7.此时你的dex2jar文件夹中会生成名为:classes.dex.dex2jar.jar的文件,使用jd-gui打开这个jar包即可查看混淆后的源码了,jd-gui下载地址:http://download.csdn.net/detail/baiyuliang2013/7801379

安卓解决代码混淆与反射的冲突