Proguard的使用

我们使用AS新建工程的时候,都会在module的build文件中默认出现

 buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

当我们需要对项目进行混淆的时候,只需要将minifyEnabled设置为true即可。同时还可以设置shrinkResources true用于剔除项目中无用的资源文件。

proguard潜规则

proguard是有默认的规则的,这些规则都是放置在sdk/tools/proguard/proguard-android.txt中,我们自己项目中需要混淆的都写在我们自己的项目中的proguard-rules.pro文件里面

主要规则

  • -keepattributes * Annotation * 保留注解中的参数

  • keep 保留包/类

  • -keepclasseswithmembernames class * { native ; }
    不混淆所有包括native方法的类。

  • -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }不混淆任何View中的set和get方法,确保属性动画可以正常。

  • -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }保留所有继承自Activity的类。即是所有的activity都不被混淆。

  • -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }所有枚举类型的都不混淆。

  • -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; }所有序列化的类中的Creator方法不被混淆

  • -keepclassmembers class **.R$* { public static ; }不混淆R文件中的静态字段,

  • -dontwarn android.support.**不用warn警告有关android.support包下的内容。

  • 不混淆android.support.annotation.Keep相关的类,方法,成员变量,初始化

      `-keep class android.support.annotation.Keep
    
      -keep @android.support.annotation.Keep class * {*;}
    
      -keepclasseswithmembers class * {
       @android.support.annotation.Keep ;
      }
    
      -keepclasseswithmembers class * {
        @android.support.annotation.Keep ;
      }
    
      -keepclasseswithmembers class * {
        @android.support.annotation.Keep (...);
      }`
    
  • 关于几个关键字

    • -dontusemixedcaseclassnames 混淆时不适用大小写混淆
    • -dontskipnonpubliclibraryclasses 不跳过library中的非public类
    • -verbose 不打因详细的混淆信息
    • -dontoptimize 不对混淆文件进行大小优化,
    • -dontpreverify 不进行检验检查

以上是关于android sdk中默认的proguard规则的介绍。接下来是对文档的翻译http://proguard.sourceforge.net/index.html#manual/usage.html主要是规则相关的

关于proguard.pro文件的编辑规则

  1. 可以使用#来注释一整行
  2. 单词和分隔符之间的空格会自动忽略,特殊需要空格的用单引号或者双引号。
  3. 配置的参数一般顺序不分先后

Input/Output Options 输入输出相关

  1. include filename 读取制定的文件
  2. basedirectory 递归读取文件目录下的内容
  3. injars CLASS_PATH 指定读入的jar的路径
  4. outjars CLASS_PATH 指定输出的jar的路径
  5. libraryjars CLASS_PATH 指定库文件的路径
  6. skipnonpubliclibraryclasses 指定跳过的非公共类
  7. dontskipnonpubliclibraryclasses 指定不跳过的非公共类
  8. dontskipnonpubliclibraryclassmembers 指定不忽略的库类的成员变量和方法
  9. keepdirectories [directory_filter] 指定输出jars的目录,默认是删除的
  10. target version 指定处理文件的版本
  11. 比较输入,输出文件的时间戳

Keep Options 保留,不混淆

  1. keep [,modifier,...] class_specification 保留指定的类和成员变量,以保存的代码为准
  2. keepclassmembers [,modifier,...] class_specification 指定保留类成员
  3. keepclasseswithmembers [,modifier,...] class_specification 在类和成员都存在的情况下保留
  4. keepnames class_specification 指定要保留的类的成员
  5. keepclassmembernames class_specification 指定保留的成员如果在代码压缩的时候没有被移除
  6. keepclasseswithmembernames class_specification 指定在压缩代码的时候保留下来的类和成员
  7. printseeds [filename] 详尽的列出要匹配的类和成员到指定的输出文件

Shrinking Options 压缩

  1. dontshrink 指定不压缩的类文件
  2. printusage [filename] 无用代码(dead code)输出到指定列表
  3. whyareyoukeeping class_specification 给出指定的类和成员在指定的压缩级别中为什么别压缩

Optimization Options 优化

  1. dontoptimize 指定不优化的类文件,默认byte级优化
  2. optimizations optimization_filter 指定在详细的优化级别中优化与否
  3. assumenosideeffects class_specification 指定即使删除也对项目没有影响的方法。例如使用该配置删除日志代码
  4. allowaccessmodification 用来进一步优化,但是不建议使用,某些虚拟机将回出问题
  5. mergeinterfacesaggressively 指定接口合并,更加不建议使用,有些虚拟机不能处理所产生的代码

Obfuscation Options 混淆

  1. dontobfuscate 指定不混淆输入的类
  2. printmapping [filename] 指定对应文件的新名字
  3. applymapping filename 指定要重新使用的特定的名字
  4. applymapping filename 指定混淆文件和方法的文本文件
  5. obfuscationdictionary filename 指定用于混淆的文件,只有混淆的时候适用
  6. classobfuscationdictionary filename 类似上一条
  7. packageobfuscationdictionary filename 类似上一条
  8. overloadaggressively 指定混淆可以重名,多个字段和方法可以重名只要参数和返回值类型不同
  9. useuniqueclassmembernames 指定相同的名字适用相同的混淆名字,不同的混淆名称分配给不同的成员
  10. dontusemixedcaseclassnames 混淆不使用大小写混合的方式
  11. keeppackagenames [package_filter] 指定包不混淆
  12. flattenpackagehierarchy [package_name] 指定包移动到一个指定的父包中以减少处理后的代码。
  13. repackageclasses [package_name] 指定类移动到一个指定的包中。
  14. keepattributes [attribute_filter] 指定要保留的属性
  15. keepparameternames 指定不混淆的方法的参数名和类型
  16. renamesourcefileattribute [string] 指定一个常量字符放在SourceFile 中
  17. adaptclassstrings [class_filter] 指定类名字符串常量被混淆
  18. adaptresourcefilenames [ FILE_FILTER ] 指定资源文件重命名
  19. adaptresourcefilecontents [ FILE_FILTER ] 指定内容会更新的资源常量

Preverification Options 校验

  1. dontpreverify 指定不校验处理的类
  2. microedition 指定处理的文件是针对Java Micro Edition

General Options 普通

  1. verbose 打印所有信息
  2. dontnote [class_filter] 指定不打印的配置潜在的错误和遗漏
  3. dontwarn [class_filter] 指定不警告未解决的参考和其他问题
  4. ignorewarnings 指定打印所有未解决的参考和问题,但是继续运行
  5. printconfiguration [filename] 打印出整个解析出来的配置,包括文件和变量
  6. dump [filename] 指定输出类文件的内部结构
    dontwarn

你可能感兴趣的:(Proguard的使用)