ProGuard
是一个开源的Java
字节码的压缩、优化、混淆、预校验工具。
由于Java
字节码很容易被反编译,而且很多时候,我们需要对字节码进行优化,ProGuard
就是一个不错的选择。
ProGuard
官网:https://www.guardsquare.com/en/proguard
ProGuard
是开源的,很多人或者组织可能会对它进行优化,Facebook
就对他进行了优化, 不过,它没有增加任何的功能,只是让它运行的更快。地址:https://github.com/facebook/proguard
Android SDK
自带了ProGuard
,位于${ANDROID_HOME}/tools/proguard
, 下面是其目录结构:
/usr/local/share/android-sdk/tools/proguard
├── README
├── ant
│ └── task.properties
├── bin
│ ├── proguard.sh
│ ├── proguardgui.sh
│ └── retrace.sh
├── lib
│ ├── proguard.jar
│ ├── proguardgui.jar
│ └── retrace.jar
├── docs
│ └── ...
├── examples
│ └── ...
├── license.html
├── proguard-android-optimize.txt
├── proguard-android.txt
└── proguard-project.txt
Android SDK
自带的ProGuard
针对Android
开发预备了混淆脚本配置文件,proguard-android.txt
和proguard-android-optimize.txt
,它们的区别就是proguard-android-optimize.txt
打开了优化开关,在混淆之前先进行优化,而proguard-android.txt
比较保守, 不进行优化。我们一般要进行优化的。
我们要在使用AndroidStudio进行开发的工程中开启ProGuard
, 就需要在build.gradle
配置文件中进行相关的配置。配置方法如下:
apply plugin: 'com.android.application' //'com.android.library'
android {
...
buildTypes {
debug {
minifyEnabled false
signingConfig signingConfigs.release
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.release
}
}
}
这里,我们一般在构建Debug
包的时候,不开启ProGuard
,只在构建Release
包的时候才会开启。minifyEnabled false
就是指示是否要开启ProGuard
。
如果开启了ProGuard
,就要说明配置脚本的路径。proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
表示使用${ANDROID_HOME}/tools/proguard/proguard-android.txt
作为默认的配置文件, 因为默认的配置文件已经为我们配置了常规的一些指令,简化开发者。通常,我们会把proguard-android.txt
修改为proguard-android-optimize.txt
, 也就是,我们会做优化。第二个参数proguard-project.txt
就是我们自己要编写的配置文件路径,一般都是在模块的根目录下。
ProGuard
依次由压缩(Shrink
)、优化(Optimize
)、混淆(Obfuscate
)和预校验(PreVerify
)四个步骤组成, 每个步骤都是可选的,我们可以通过指令来决定执行其中的哪几个步骤。
每个步骤执行的工作是:
ProGuard
配置文件是由一系列的指令组成的,每个指令以-
开头。
在AndroidStudio中,书写ProGuard
配置文件的指令是会有提示的, 这个非常赞,避免我们写错指令和经常查询文档。 因为ProGuard
配置文件的很多指令是由多个单词组成的,指令名非常的长,写错的可能性也是很大的。