一、简介
代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。
1.优点
令 APK 难以被逆向工程,即很大程度上增加反编译的成本。此外,Android 当中的"混淆"还能够在打包时移除无用资源,显著减少 APK 体积。
2.建议
发布一款应用除了设minifyEnabled为ture,你也应该设置zipAlignEnabled为true,像Google Play强制要求开发者上传的应用必须是经过zipAlign的,zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。
二、启动混淆
通过工程下的build.gradle文件中的开启混淆开关和配置混淆规则文件
buildTypes {
release {
//不显示log
buildConfigField "boolean", "LOG_DEBUG", "false"
//开启混淆
minifyEnabled true
//开启资源压缩
shrinkResources true
//Zipalign优化
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
- shrinkResources:资源压缩
- zipAlignEnabled:Zipalign优化
- minifyEnabled:混淆开关
- proguard-android.txt:SDK中默认proguard的配置规则
- proguard-rules.pro:自定义proguard的配置规则
三、混淆语法
1.类名
对类名进行keep操作只是将类名keep住,但方法和变量仍然会被混淆
# 一颗星表示keep当前本包下的类名,子包下的类名是会被混淆的
-keep class com.example.hensen.*
# 两颗星表示keep当前本包下的类名和子包下的类名
-keep class com.example.hensen.**
# 表示keep当前类名
-keep class com.example.hensen.net.NetWorkCache
# 表示keep当前类的内部类的类名
-keep class com.example.hensen.net.NetWorkCache$NetWorkBean
2.内容
对内容进行keep操作不仅可以将类名keep住,还可以对方法和变量keep住
# 一颗星表示keep当前本包下的类名、类的内容
-keep class com.example.hensen.*{
*;}
# 两颗星表示keep当前本包下的类名、类的内容和子包下的类名、类的内容
-keep class com.example.hensen.**{
*;}
# 表示keep当前类名、类的内容
-keep class com.example.hensen.net.NetWorkCache{
*;}
# 表示keep当前类的内部类的类名、内部类的内容
-keep class com.example.hensen.net.NetWorkCache$NetWorkBean{
*;}
3.特定内容
对特定的内容进行keep操作
-keep class com.example.hensen.net.NetWorkCache{
<init>;# 匹配所有构造器
<fields>;# 匹配所有变量
<methods>;# 匹配所有方法
public <methods>;# 匹配所有共有的方法
private <methods>;# 匹配所有私有的方法
public *;# 匹配所有共有的内容
private *;# 匹配所有私有的内容
public <init>(java.lang.String);# 匹配特定参数的构造函数
public void getCache(...);# 匹配任意长度类型参数的方法
}
4.类成员
对类名不需要keep,只需要对类下的方法进行keep操作
# 表示keep特定类下的特定参数的方法,但类名不会被keep
-keepclassmembernames class com.example.hensen.net.NetWorkCache{
public void getCache(java.lang.String);
}
5.类和类成员
作用范围 | 防止被移出或重命名 | 防止被重命名 |
---|---|---|
类和类成员 | -keep | -keepnames |
仅类成员 | -keepclassmembers | -keepclassmembernames |
类和类成员(前提是成员都存在) | -keepclasseswithmembers | -keepclasseswithmembernames |
四、混淆通用规则
#############################################
#
# 基本指令区域(没什么别的需求不需要动)
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 这句话能够使我们的项目混淆后产生映射文件
#