使用方式
//buildType下的任一个属性都可以
debug {
//开启混淆
minifyEnabled true
//指定混淆文件
proguardFiles 'proguard-rules.pro','proguard-extra.pro','proguard-self.pro'
}
基本语法
常用选项
- -libraryjars 应用的依赖包,如android-support-v4
- -keep 不混淆某些类
- -keepclassmembers 不混淆类的成员
- -keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。
- -keepnames 不混淆类及其成员名,只在混淆阶段生效。
- -keepclassmembernames 不混淆类的成员名,只在混淆阶段生效。
- -keepclasseswithmembernames 不混淆类及其成员名,假如指定的类成员名存在,只在混淆阶段生效。
- -dontwarn 不提示warnning(缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。)
占位符
占位符 | 含义 |
? | 任何一个单一字符 |
* | 名字的一部分,不包含目录或包名分隔符 |
** | 名字的一部分,可能包含目录或包名分隔符 |
$ | 内部类分隔符,如A$B,代表A的内部类B |
% | 任何原始类型 (“boolean”, “int”, etc, but not “void”). |
*** | 任何类型 (原始类型 or 非原始类型, array or non-array). |
… | 任何数量,任何类型的参数 |
<init> | 任何的构造函数 |
<fields> | 任何的变量 |
<methods> | 任何的方法 |
* | 任何的变量和方法 |
类的结构
- [ ]代表可选的选项。
- …代表可以定义任意数量的前面的项。
- | 分割两个可以相互替代的项。
- ! 代表相反的情况。
- 缩进只是为了澄清目的意义,实际的配置文件中空格是无关紧要的。
更多
关于proguard更多语法可见:proguard官方文档
不可混淆内容
在代码中根据名字调用的内容不可被混淆。
1. 注解
2. Native 本地方法
3. JNI 代码
4. 枚举类型
5. 反射相关的代码
6. AIDL 所需代码
7. 和 XML 有关联的 class 文件(Proguard 只是针对 class 文件的混淆,而 Android 组件都是通过反射来读取 XML 内信息,如:Activity,Service,ContentProvider,Broadcast,自定义控件,布局文件, AndroidManifest.xml 等)都不可混淆
8. 所有为外部提供的接口和方法尽量保留,因为混淆后文件名被替换,有些被调用对象就可 能找不到源方法。
9. Bean 文件(某些库,比如Gson在使用bean文件时,会根据里面的变量/方法名来解析json串,混淆会导致变量无法被正确赋值)
10. Android 的 R 文件
11. 内部类
12. 第三方类库(含官方 support 库),因为第三方库的不透明性,混淆时尽量保护其不被混淆。
PS:很多第三方库官网提供混淆配置方式,可直接使用官方配置。
13. 自定义 View
14. 实现了 Parcelable 或 Serializable 的序列化类