zoukankan      html  css  js  c++  java
  • 安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法

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

  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7209371.html
Copyright © 2011-2022 走看看