前言
上一篇文章讲解了android应用的反编译,为了保证应用的安全性,代码混淆是必须的。
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。
将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。
下面讲解在android studio代码混淆的具体流程。
混淆步骤
1.生成签名文件。(参考后文的“创建KeyStore文件”)
2.修改Module下的build.gradle文件,将minifyEnabled false改为minifyEnabled true。
说明:
- proguardFiles getDefaultProguardFile(‘proguard-android.txt’)表示获取SDK下’proguard-android.txt‘文件中的默认混淆规则。
- proguard-project.txt文件中添加混淆的项目规则,可参考后文“混淆规则”。
- proguard-rules.pro表示使用项目根目录下的 ‘proguard-rules.pro’文件中的混淆规则。
提示:proguard-rules.pro文件名可以任意,只要在配置文件中指明即可。比如,从其它项目中复制一个proguard.cfg混淆规则文件,只需将上面的代码改成 proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard.cfg’即可,这句话表示使用项目中根目录下的proguard.cfg文件作为本项目的混淆规则文件。
3.打包项目,使用Build菜单下的Generate Signed APK进行打包即可。注意,记得在Build Type:选项下选择release,否则只打包不会混淆。
混淆的基本步骤就是这样,但是真正的核心部分在于混淆规则的定义。
创建KeyStore文件
安装android studio后,在系统盘的用户目录下有一个.android文件夹,签名工具就在这个文件夹下面。
进入此文件下,我们可以看到我们已经有的*.keysotre文件。
我这里已经有了一个debug.keystore文件了,不过我暂时用不着,也不记得密码啥子的了。
所以我们重新生成一个,也可以删除原有内容,然后重新生成一个文件。
当然,我们要先进入.android文件夹下面才能操作。运行cmd => 输入:cd .android =>再输入我们的命令
完成后续的生成这样一个release.keystore文件我们就生成了。生成的文件,我们需要拷贝到和上面的配置(build.gradle),同目录下即可。
混淆规则
Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。
ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。它可以将类、字段和方法使用短无意义的名称进行重命名。最后,预校验的Java6或针对Java MicroEdition的所述处理后的码。
下面就和大家分享一下对使用了第三方库的项目进行混淆的经验。
ProGuard默认会对第三方库也进行混淆的,而第三方库有的已经混淆过了,有的使用了Java反射技术,所以我们在进行代码混淆的时候要排除这些第三方库。排除对第三方库的混淆需要在混淆规则文件(通常是:proguard-project.txt或proguard.cfg或proguard-rules.pro或proguard-rules.txt也可以是其它的文件名只要在配置文件中将含有混淆规则的文件名配置进去就行了)中添加如下规则:
- 1.如果使用了Gson之类的工具要使JavaBean类即实体类不被混淆。
- 2.如果使用了自定义控件那么要保证它们不参与混淆。
- 3.如果使用了枚举要保证枚举不被混淆。
- 4.对第三方库中的类不进行混淆
A.混淆时保护引用的第三方jar包,如:
注意:在使用Eclipse+ADT时需要加入-libraryjars libs/…,如果你是使用Android Studio开发的项目则不需要加入libs包中的jar包,这是因为,通过Android Studio进行混淆代码时,默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加,否则会出现“ java.io.IOException: The same input jar is specified twice” 错误。
B.混淆时保护第三方jar包中的类不被混淆,如:
规则说明
|
|
另外加上一段,如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
如果你使用了webview
混淆示例
开发中用到的一些混淆规则,大家可以根据需要复制到自己的项目中的混淆规则的文件中即可。