浅谈Android ProGuard代码混淆
本文目的:
当别人提到Android代码ProGuard混淆时候,或者说项目如何对抗反编译,自己大概心里有点数
请各位上车
Java代码是非常容易被反编译的,下载好工具按照步骤就可以实现。为了保护好java源码,反编译之后让代码也不容易阅读,我们就需要对编译好的class文件进行混淆处理。
使用什么进行混淆?
Proguard是一个混淆代码的开源项目,主要作用是混淆,还可以对字节码进行缩减体积、优化等。
都有什么基本语法?
- 保留类名
- 保留方法名
- 保留类名和方法名
除了保留的这些,其他都是proguard需要混淆的地方!
都已经要混淆了,为什么还要保留类名或者方法名呢?
- 让C/C++程序可以通过jni使用对应的java方法
- 四大组件由于在清单文件中注册了,所以得保留
- R文件混淆会导致引用错误
如何打开混淆?
在build.gradle里面的minifyEnabled,如果为false则不使用proguard混淆。如果是true则使用proguard混淆。
混淆语法是写在哪个文件呢?
是写在proguard-android.txt 和 proguard-rules.pro文件中。
proguard可以去除Log!
我们在开发的时候,经常会打印一些log信息,但是等到apk发布运行的时候,就不希望有输出日志了。
如何解决这个问题呢?
我们可以自己写一个打印Log的工具类,每次准备打包升级时候,手动修改是否打印。或者删除项目中所有打印输出代码。
另外,我们也可以通过配置proguard,将android.util.Log的方法设置成无效。配置完之后,可以去除apk中打印日志的代码!!!反编译之后的效果就是,封装的log类和log输出的语句都会被去掉!!!
对抗android模拟器
当我们的apk处于一个被检测的状态的时候,大多是运行在模拟器上而不是真机上,所以我们可检测当前程序是否是运行在模拟器上,如果是的话就关闭当前程序或杀死当前程序进程。
如何检测呢?
- 检测模拟器特有的几个文件
- 检测模拟器默认的电话号码
- 检测设备IDS是不是“00000000000000000”
- 检测imsi id是不是“3102600000000000”
- 检测手机上的一些硬件信息
- 检测手机运营商家
对抗APK重打包?
反编译之后的代码,重新打包,需要重新签名才能够运行。也就是说这个时候的签名和原来的签名是不一致的。
我们可以判断一下,如果签名不一致,就退出程序或者杀死当前进程。
最后
ProGuard官网使用指导:http://proguard.sourceforge.net/
PS: 祝贺小恶魔第三次斩获艾美奖剧情类剧集最佳男配角!