我们使用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 <methods>; }
不混淆所有包括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 <fields>; }
不混淆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 <methods>; } -keepclasseswithmembers class * { @android.support.annotation.Keep <fields>; } -keepclasseswithmembers class * { @android.support.annotation.Keep <init>(...); }`
-
关于几个关键字
- -dontusemixedcaseclassnames 混淆时不适用大小写混淆
- -dontskipnonpubliclibraryclasses 不跳过library中的非public类
- -verbose 不打因详细的混淆信息
- -dontoptimize 不对混淆文件进行大小优化,
- -dontpreverify 不进行检验检查
<b>以上是关于android sdk中默认的proguard规则的介绍。接下来是对文档的翻译http://proguard.sourceforge.net/index.html#manual/usage.html主要是规则相关的</b>
关于proguard.pro文件的编辑规则
- 可以使用#来注释一整行
- 单词和分隔符之间的空格会自动忽略,特殊需要空格的用单引号或者双引号。
- 配置的参数一般顺序不分先后
Input/Output Options 输入输出相关
- include filename 读取制定的文件
- basedirectory 递归读取文件目录下的内容
- injars CLASS_PATH 指定读入的jar的路径
- outjars CLASS_PATH 指定输出的jar的路径
- libraryjars CLASS_PATH 指定库文件的路径
- skipnonpubliclibraryclasses 指定跳过的非公共类
- dontskipnonpubliclibraryclasses 指定不跳过的非公共类
- dontskipnonpubliclibraryclassmembers 指定不忽略的库类的成员变量和方法
- keepdirectories [directory_filter] 指定输出jars的目录,默认是删除的
- target version 指定处理文件的版本
- 比较输入,输出文件的时间戳
Keep Options 保留,不混淆
- <b>keep [,modifier,...] class_specification 保留指定的类和成员变量,以保存的代码为准</b>
- keepclassmembers [,modifier,...] class_specification 指定保留类成员
- keepclasseswithmembers [,modifier,...] class_specification 在类和成员都存在的情况下保留
- keepnames class_specification 指定要保留的类的成员
- keepclassmembernames class_specification 指定保留的成员如果在代码压缩的时候没有被移除
- keepclasseswithmembernames class_specification 指定在压缩代码的时候保留下来的类和成员
- printseeds [filename] 详尽的列出要匹配的类和成员到指定的输出文件
Shrinking Options 压缩
- dontshrink 指定不压缩的类文件
- printusage [filename] 无用代码(dead code)输出到指定列表
- whyareyoukeeping class_specification 给出指定的类和成员在指定的压缩级别中为什么别压缩
Optimization Options 优化
- dontoptimize 指定不优化的类文件,默认byte级优化
- optimizations optimization_filter 指定在详细的优化级别中优化与否
- assumenosideeffects class_specification 指定即使删除也对项目没有影响的方法。例如使用该配置删除日志代码
- allowaccessmodification 用来进一步优化,但是不建议使用,某些虚拟机将回出问题
- mergeinterfacesaggressively 指定接口合并,更加不建议使用,有些虚拟机不能处理所产生的代码
Obfuscation Options 混淆
- dontobfuscate 指定不混淆输入的类
- printmapping [filename] 指定对应文件的新名字
- applymapping filename 指定要重新使用的特定的名字
- applymapping filename 指定混淆文件和方法的文本文件
- obfuscationdictionary filename 指定用于混淆的文件,只有混淆的时候适用
- classobfuscationdictionary filename 类似上一条
- packageobfuscationdictionary filename 类似上一条
- overloadaggressively 指定混淆可以重名,多个字段和方法可以重名只要参数和返回值类型不同
- useuniqueclassmembernames 指定相同的名字适用相同的混淆名字,不同的混淆名称分配给不同的成员
- dontusemixedcaseclassnames 混淆不使用大小写混合的方式
- keeppackagenames [package_filter] 指定包不混淆
- flattenpackagehierarchy [package_name] 指定包移动到一个指定的父包中以减少处理后的代码。
- repackageclasses [package_name] 指定类移动到一个指定的包中。
- <b>keepattributes [attribute_filter] 指定要保留的属性</b>
- keepparameternames 指定不混淆的方法的参数名和类型
- renamesourcefileattribute [string] 指定一个常量字符放在SourceFile 中
- adaptclassstrings [class_filter] 指定类名字符串常量被混淆
- adaptresourcefilenames [ FILE_FILTER ] 指定资源文件重命名
- adaptresourcefilecontents [ FILE_FILTER ] 指定内容会更新的资源常量
Preverification Options 校验
- dontpreverify 指定不校验处理的类
- microedition 指定处理的文件是针对Java Micro Edition
General Options 普通
- verbose 打印所有信息
- dontnote [class_filter] 指定不打印的配置潜在的错误和遗漏
- <b>dontwarn [class_filter] 指定不警告未解决的参考和其他问题</b>
- ignorewarnings 指定打印所有未解决的参考和问题,但是继续运行
- printconfiguration [filename] 打印出整个解析出来的配置,包括文件和变量
- dump [filename] 指定输出类文件的内部结构
dontwarn