proguard用法

来源:互联网 发布:函数式编程思维 编辑:程序博客网 时间:2024/06/05 02:52

使用方式

        //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⁢> 任何的方法 * 任何的变量和方法

类的结构

类结构图

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

更多

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

0 0
原创粉丝点击