一.分类
Android 代码混淆有两种形式
1.ProGuard文件:一个通用的 Java 字节码优化工具。
2.R8:ProGuard 的继承者,专为 Android 设计,编译性能和编译产物更优秀。
启用与禁用 R8
# 显式启用 R8
android.enableR8 = true
# 只对 Android Library module 停用 R8 编译器
android.enableR8.libraries = false
# 对所有 module 停用 R8 编译器
android.enableR8 = false
二.代码混淆四大功能
ProGuard 与 R8 都提供了压缩(shrinker)、优化(optimizer)、混淆(obfuscator)、预校验(preverifier)四大功能。
1.压缩(也称为摇树优化,tree shaking):从 应用及依赖项 中移除 未使用 的类、方法和字段,有助于规避 64 方法数的瓶颈。
2.优化:通过代码 分析 移除更多未使用的代码,甚至重写代码。
3.混淆:使用无意义的简短名称 重命名 类/方法/字段,增加逆向难度。
4.预校验:对于面向 Java 6 或者 Java 7 JVM 的 class 文件,编译时可以把 预校验信息 添加到类文件中(StackMap 和 StackMapTable属性),从而加快类加载效率。预校验对于 Java 7 JVM 来说是必须的,但是对于 Android 平台 无效。
三.使用
1.Gradle
buildTypes {
release {
//启用代码压缩、优化和混淆(由R8或者ProGuard执行)
minifyEnabled true
//指定混淆保留规则文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
注意:指定混淆保留规则文件有两种方式
// 方式一:
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// 方式二:
proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
proguardFile 'proguard-rules.pro'
2.混淆文件位置
运行后,在下图中的目录中系统会自动生成混淆文件
注意:代码混淆时还可以添加压缩图片功能来减少APK的大小。
buildTypes {
release {
minifyEnabled true
//启用资源压缩
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
3.关键词
<1> dontwarn:忽略警告
//忽略support包下的所有警告
-dontwarn android.support.**
//忽略androidx包下的所有警告
-dontwarn androidx.**
<2> keep:保证不被混淆
//保证OKHttp不被混淆
-keep class okhttp3.**{*;}
-keep class okio.**{*;}
<3> keepclassmembers:保证类成员 ( 成员变量 , 成员方法 ) 不被混淆 。 类名还是会被混淆的。
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
<4> -keepclasseswithmembernames:-keep 作用类似 , 都可以保留 类名 与 成员 不被混淆。
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
-keepclasseswithmembernames 与 -keep 配置区别 : -keepclasseswithmembernames 中假如配置的 保留成员不存在 , 则该 混淆不生效。