博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
阅读量:5965 次
发布时间:2019-06-19

本文共 1069 字,大约阅读时间需要 3 分钟。

     此前的代码混淆,由于并没实用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此须要通过反射由文件名称找到表情资源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$* {*;}

补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:

-keep class com.baidu.**   {*;}-keep class vi.com.**   {*;}

保持百度地图相关类不被混淆,可是地图仍然出错(仅仅显示网格,无法搜索POI等)。这是为什么呢?原因是。混淆前的SHA1和混淆后的SHA1不同,你使用的百度AK依旧是混淆前申请的。所以用在混淆后的安装包里当然无法使用了,解决的方法就是用混淆时所用的签名文件里的SHA1又一次去百度官网申请AK后再又一次打包。

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

1.下载反编译工具:dex2jar 下载地址:

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下载地址:

你可能感兴趣的文章
那年匆匆 -大学
查看>>
Internet 打印提示“打印机安装失败、打印机名称无效”的解决
查看>>
从Powershell ***脚本学到的如何执行后台runspace~
查看>>
SCCM TP4部署Office2013
查看>>
Linux系统启动过程,grub重装。
查看>>
使用Putty密钥认证机制远程登录Linux
查看>>
一不小心,老司机又翻车了
查看>>
理解思科IPS系统的traffic flow notifications
查看>>
【博客话题】技术人生之三界修炼
查看>>
Ext JS 6开发实例(三) :主界面设计
查看>>
Hyper-V 3中虚拟机CPU竞争机制
查看>>
【原创】Oracle RAC原理和安装
查看>>
单IP无TMG拓扑Lync Server 2013:外部访问
查看>>
Node.js+Express商业开发中的安全性考虑
查看>>
Wijmo 更优美的jQuery UI部件集:运行时处理Wijmo GridView数据操作
查看>>
东哥读书小记 之 《MacTalk人生元编程》
查看>>
《随机出题软件》&《随机分队软件》源码(Windows API)
查看>>
python 文件及文件夹操作
查看>>
Android自定义ListView的Item无法响应OnItemClick的解决办法
查看>>
Building Apps for Windows Phone 8.1教程下载地址整理
查看>>