一、简介
代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。 令 APK 难以被逆向工程,即很大程度上增加反编译的成本。此外,Android 当中的"混淆"还能够在打包时移除无用资源,显著减少 APK 体积。
二、启动混淆
buildTypes {
release {
//不显示log
buildConfigField "boolean", "LOG_DEBUG", "false"
//开启混淆
minifyEnabled true
//开启资源压缩
shrinkResources true
//Zipalign优化
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
三、混淆语法
3.1 类名
对类名进行keep操作只是将类名keep住,但方法和变量仍然会被混淆
# 一颗星表示keep当前本包下的类名,子包下的类名是会被混淆的
-keep
class
com.example.hunxiao.*
# 两颗星表示keep当前本包下的类名和子包下的类名
-keep
class
com.example.hunxiao.**
# 表示keep当前类名
-keep
class
com.example.hunxiao.net.NetWorkCache
# 表示keep当前类的内部类的类名
-keep
class
com.example.hunxiao.net.NetWorkCache$NetWorkBean
3.2 内容
对内容进行keep操作不仅可以将类名keep住,还可以对方法和变量keep住
# 一颗星表示keep当前本包下的类名、类的内容
-keep
class
com.example.hunxiao.*{*;}
# 两颗星表示keep当前本包下的类名、类的内容和子包下的类名、类的内容
-keep
class
com.example.hunxiao.**{*;}
# 表示keep当前类名、类的内容
-keep
class
com.example.hunxiao.net.NetWorkCache{*;}
# 表示keep当前类的内部类的类名、内部类的内容
-keep
class
com.example.hunxiao.net.NetWorkCache$NetWorkBean{*;}
3.3 特定内容
对特定的内容进行keep操作
-keep
class
com.example.hunxiao.net.NetWorkCache{
<init>;# 匹配所有构造器
<fields>;# 匹配所有变量
<methods>;# 匹配所有方法
public
<methods>;# 匹配所有共有的方法
private
<methods>;# 匹配所有私有的方法
public
*;# 匹配所有共有的内容
private
*;# 匹配所有私有的内容
public
<init>(java.lang.String);# 匹配特定参数的构造函数
public
void
getCache(...);# 匹配任意长度类型参数的方法
}
3.4 类成员
对类名不需要keep,只需要对类下的方法进行keep操作
# 表示keep特定类下的特定参数的方法,但类名不会被keep
-keepclassmembernames
class
com.example.hunxiao.net.NetWorkCache{
public
void
getCache(java.lang.String);
}
注意事项
对于第三方框架的混淆,一般公开的框架都会提供混淆方法,只要到框架的github下就能找到。
对于反射类的混淆,只要保持反射用到的类名和方法即可,并不需要将整个被反射到的类都进行保持。