简介
在 Android 打出正式的 APK 安装包时,通常为了增加别人反编译后阅读源代码的难度,需要做一些混淆工作。在 Android Studio 中配合 Gradle 很容易完成这个操作。
Proguard 作用
- 压缩 Shrinking : 默认是开启的,移除未被使用的类和成员,并且在 优化Optimization **工作执行后还会再次执行。
- 优化 Optimization : 默认是开启的,在字节码级别执行优化,让应用运行的更快。
- 混淆 Obfuscation : 默认是开启的,增大反编译的难度,除了被 keep 保持的类和类成员都会被随机命名。
它们都是可以在配置文件 proguard-rules.pro 中进行关闭的,比如:
-dontshrink # 关闭压缩
-dontoptimize # 关闭优化
-dontobfuscate # 关闭混淆
Android 开启混淆
Android 开启混淆只需在 build.gradle 中配置 minifyEnabled true ,然后在 proguard-rules.pro 加入混淆规则即可。
android {
........
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
开启混淆后,在打出 release 版包时,会在 build/outputs/mapping/ 目录下生成 mapping.txt 文件,该文件是原始代码和混淆后的代码的一种对应转换关系,我们推导出原始代码名称。
基本规则
- 星号 *
-keep class com.xing.weijian.*
-keep class com.xing.weijian.**
(1) 一个 * 号表示只保持该包下的类名不被混淆,而子包下的类名还是会被混淆的。
(2) 两个 * 号表示该包和所含子包,子包包含的多级子包下的类名都保持不被混淆。
注意:上面这配置只保持了类名没有被混淆,但是其中的方法和成员变量的名称还是被混淆改变了,如果既想保持类名,又想保持方法和成员变量不被混淆,需要使用以下方式:
-keep class com.xing.weijian.* {*;}