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

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

时间: 2024-10-10 09:07:05

安卓解决代码混淆与反射的冲突的相关文章

御安全浅析安卓开发代码混淆技术

御安全浅析安卓开发代码混淆技术[关键词:代码混淆,Android应用加固,移动应用保护,APP保护,御安全] 提高native代码的安全性有什么好办法吗?答案是肯定的,今天我们就来介绍一种有效对抗native层代码分析的方法--代码混淆技术.随着移动互联网的快速发展,应用的安全问题不断涌现出来,于是越来越多的应用开发者将核心代码由java层转到native层,以对抗成熟的java逆向分析工具,然而如果native层的代码如果没有进行任何保护,还是比较容易被逆向分析工作者获取其运行逻辑,进而完成应

安卓与“Proguard”——安卓的代码混淆

谨以此文,记我在公司实习时,所接到的第一个正式的.真正有意义的任务--将公司即将发布的APK进行代码混淆. 什么是代码混淆 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义.被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量.函数.类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读.同时混淆是不

git解决代码冲突

1.当项目开发是几个人的时候,难免会出现代码冲突,使用git命令行解决冲突的方法如下: git checkout develop git pullgit checkout feature/新建会员功能git merge develop 将develop merge到 分支上git status 查看状态在ide下解掉冲突 :wq git add web-app/source/app/胜利iews/member/students.html 冲突的文件git commitgit push origi

安卓代码混淆注意事项

安卓代码混淆时经常会出现各种问题,下面罗列一些注意事项 1.依赖的工程中使用的jar包若和工程自身中的jar包一样的话,直接删除依赖工程中相同的jar包即可 2.native方法要阻止混淆 例: # natvie 方法不混淆 -keepclasseswithmembernames class * { native <methods>; } 3.若自定义基类Activity中有根据名称为控件注入值的要采用如下方法阻止字段被混消 如 基类Activity中有如下控件注入方法 protected v

git解决代码提交冲突

树冲突文件名修改造成的冲突,称为树冲突.比如,A同事把文件改名为A.C,B同事把同一个文件改名为B.C,那么B同事将这两个commit合并时,会产生冲突.如果最终确定用B同事的文件名,那么解决办法如下:git rm A.Cgit rm origin-name.Cgit add B.Cgit commit如果最终确定用A同事的文件名,那么解决办法如下:git rm B.Cgit rm origin-name.Cgit add A.Cgit commit内容冲突(git pull拉取最新代码发现)一

代码管理工具git使用来解决代码冲突管理

现在做软件产品项目,基本都用git来进行代码管理.相比SVN,git刚上手的人对git的使用的确感到很受伤.总结坑如下: 1.对git理解不透,不晓得git本地仓库,远程仓库的命令 2.SVN在Eclipse中的使用比git要舒服,不易出错. 但是项目代码使用git管理是大势所趋,不得不好好掌握.好在经过多次实践后,终于在git cmd中利用命令完美解决代码同步管理. 同步远程代码,遇到冲突的解决方法 1.方法一,采用远程文件覆盖本地文件. git pull git checkout <文件路径

安卓 代码混淆与打包

gradle的配置 proguard-rules.pro混淆配置 ###-----------基本配置-不能被混淆的------------ -keep public class * extends android.app.Activity -keep public class * extends android.app.Fragment -keep public class * extends android.app.Application -keep public class * exten

安卓代码混淆中常量的处理方法

最近一直在研究代码混淆,其中发现一个问题,就是我们定义的一些公用的常量在代码混淆后,经过反编译,竟然完完整整的显示在我的眼前,比如服务请求地址,竟然以完整路径的形式显示在混淆后的代码中,比自己定义的还要完整,要是这样的话,代码混淆还有意义吗?当时很郁闷,不过又一想,常量肯定是不能被混淆的,若常量被混淆,1混成个2,其它地方再去引用必然会出错啊,那这怎么办呢?又想进行混淆,又不想让比较重要的常量明目张胆的显示?办法肯定是有的,只是你愿不愿去思考.我们可以对比下原项目和混淆后解压出来的项目结构,你就

浅谈Android保护技术__代码混淆

浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字.比如改写成单个字母,或是简短的无意义字母组合,甚至改写成"__"这样的符号,使得阅读的人无法根据名字猜测其用途.对于支持反射的语言,代码混淆有可能与反射发生冲突.代码混淆并不能真正阻止反向工程,只能增大其难度.因此,对于对安全性要求很高的场合,仅仅