使用方式

//buildType下的任一个属性都可以
        debug {
            //开启混淆
            minifyEnabled true
            //指定混淆文件
            proguardFiles 'proguard-rules.pro','proguard-extra.pro','proguard-self.pro'
        }

基本语法

常用选项

  1. -libraryjars 应用的依赖包,如android-support-v4
  2. -keep 不混淆某些类
  3. -keepclassmembers 不混淆类的成员
  4. -keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。
  5. -keepnames 不混淆类及其成员名,只在混淆阶段生效。
  6. -keepclassmembernames 不混淆类的成员名,只在混淆阶段生效。
  7. -keepclasseswithmembernames 不混淆类及其成员名,假如指定的类成员名存在,只在混淆阶段生效。
  8. -dontwarn 不提示warnning(缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。)

占位符

占位符

含义

?

任何一个单一字符

*

名字的一部分,不包含目录或包名分隔符

**

名字的一部分,可能包含目录或包名分隔符

$

内部类分隔符,如A$B,代表A的内部类B

%

任何原始类型 (“boolean”, “int”, etc, but not “void”).

***

任何类型 (原始类型 or 非原始类型, array or non-array).


任何数量,任何类型的参数

<⁢init⁢>

任何的构造函数

<⁢fields⁢>

任何的变量

<⁢methods⁢>

任何的方法

*

任何的变量和方法

类的结构

android proguard 文件 proguard使用_android proguard 文件

  • [ ]代表可选的选项。
  • …代表可以定义任意数量的前面的项。
  • | 分割两个可以相互替代的项。
  • ! 代表相反的情况。
  • 缩进只是为了澄清目的意义,实际的配置文件中空格是无关紧要的。

更多

关于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 的序列化类