目录:
1、Proguard初识
2、Proguard使用
1. Proguard初识
1.0. 引入
我们知道,程序包的生成过程是先将Java文件编译成.class字节码文件然后再打包生成程序包。而程序包很容易被解压回字节码文件,字节码文件中又包含几乎所有的程序信息,因此很容易被反编译获取到Java源代码。
那为了避免程序包被反编译使源代码泄露造成不必要的损失,有必要对字节码文件进行混淆。ProGuard(官网似乎要翻墙哦!)就可以做到代码混淆,让逆向工程师更难理解和复制,此外ProGuard还可以减小代码的体积,对代码进行优化。
如果你要做更为深层的代码安全性保护,可以考虑了解下DexGuard。
1.1. 功能
ProGuard可以对Java文件进行压缩、优化、混淆和预校验,可以检查和移除无用代码,减少程序包的体积。可以对文件内容进行混淆,防止被反编译。
1.2. 优点
- 模板化配置
- 简单的命令行选项
- 快速的处理过程
1.3. 工作过程
ProGuard就做四件事:
压缩(Shrink)、优化(Optimize)、混淆(Obfuscate)、预校验(Preverify)。
先来看看这几个过程涉及的一个关键词:
入口点(EntryPoint),这里简称EP,EP指的是被保持的代码,它决定了哪些代码不被移除或者混淆。
1.3.1. 压缩
压缩是发现没有使用的类、方法、字段和特性,然后将其移除以减少代码量。
压缩时从EP开始递归遍历,搜索被使用的类和类成员,将未被使用到的移除。
1.3.2. 优化
优化是对字节码进行优化,移除无用的指令,这个功能默认是不开启的.
优化时用private、static、final等修饰符修饰非EP的类和方法,移除无用的参数,将一些方法变成内联方法。
1.3.3. 混淆
混淆是通过使用简短的名称如a,b,c来命名类,方法和变量名。
混淆时保留作为EP的类和类成员名,重命名非EP的类和类成员名。
1.3.4. 预校验
预校验是确保加载的class文件是可执行的,这个功能也是默认不开启的
1.4. 关闭四大功能
# 关闭压缩功能
-dontshrink
# 关闭优化功能
-dontoptimize
# 关闭混淆功能
-dontobfuscate
# 关闭预校验功能
-dontpreverify
2. Proguard使用
2.1. 基础语法
- proguard以一行为一条语句,以空格为分隔符
-
#
是注释符 - 文件名有空格等特殊符号的用单引号、双引号标记
2.2. ProGuard有七种指令选项:
- I/O选项
- Keep选项
- 压缩选项
- 优化选项
- 混淆选项
- 预校验选项
- 通用选项
详细可参考Proguard选项
2.3. 通配符
?
单个字符
*
多个字符
**
任意多个字符
%
基本类型
***
任意类型
···
多个参数
<init>
构造方法
<fields>
字段
<methods>
方法
2.4. Android ProGuard 的使用
在proguard-rules.pro文件中添加需要的规则,在AndroidStudio中的build.gradle文件中进行配置,如下:
android {
buildTypes {
debug {
buildConfigField "boolean", "LOG_DEBUG", "true"
// VersionName后缀
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
}
release {
// 不显示log
buildConfigField "boolean", "LOG_DEBUG", "false"
// 混淆
minifyEnabled true
// Zipalign优化
zipAlignEnabled true
// 移除无用的resource
shrinkResources true
// 混淆配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
<a>注意:</a>
- ProGuard做处理需要占用一定的时间,因此在调试过程中不建议开启,如上,debug时的
minifyEnabled false
- 由于android sdk 的 /sdk/tools/proguard/proguard-android.txt 中已经提供了基本的混淆配置,不需要在 proguard-rules.pro 中重复配置。
2.5. AndroidSdk中的Proguard工具
-
ant
文件夹存放构建Ant工具的配置文件 -
bin
文件夹放的是运行ProGuard程序的批处理脚本,.bat文件 -
docs
文件夹是ProGuard的文档 -
examples
文件夹是配置文件的栗子 -
lib
文件夹里面是三个jar包 - 三个
.txt
文件是默认的配置文件
2.6. ProGuard使用注意事项
- 反射用到的类不能混淆,JNI(Java Native Interface)方法不混淆
- 清单文件AndroidManifest中的类不混淆
- 四大组件、Application的子类、Framework层下所有的类默认不进行混淆
- Parcelable的子类和Creator静态成员变量不混淆
- 使用GSON、fastjson等框架时,JSON对象类不混淆,否则无法将JSON解析成对应的对象
- 使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则
- 有用到WebView的JS调用也需要保证写的接口方法不混淆
参考资料:
Android Studio:ProGuard 混淆配置
ProGuard系列 - Android ProGuard