ProGuard一共包括四个功能
1.压缩(Shrink) 2.优化(Optimize) 3.混淆(Obfuscate) 4.预检(Preveirfy)
ProGuard是一个开源项目,在SourceForge上进行维护
http://ProGuard.sourceforge.net 可以下载查看官方文档和示例
一、基本指令
防止被移除或者重命名
防止被重命名
类和类成员
-keep
-keepnames
仅类成员
-keepclassmembers
-keepclassmembernames
如果拥有某成员,保留类和类成员
-keepclasseswithmembers
-keepclasswithmembernames
<init>; 匹配所有构造器
<fields>; 匹配所有域
<methods>; 匹配所有方法
-keep class 包名.**{*;} 两星表示本包和所含子包下的类名都保持一星表示本包保持,包下子类还是会被混淆,大括号中*表示内容也不混
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {Modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护得更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类的成员是要存在的
-keepnams {class_specification} 保护指定的类的成员和名称(如果他们不会在压缩的过程中被删除)
-keepclassmembernames {class_specification} 保护指定类的成员的名称(如果他们不会在压缩的过程中被删除)
-keepclasseswithmembersnams {class_specification} 保护指定的类和类成员的名称,如果所有指定的类成员出席(在压缩之后)
-printseeds {filename} 列出类和类成员-keep选项的清单,标准输出到给定的文件
例如:
# 指定Keep类名不被混淆,类中的方法和成员仍然会被混淆
-keep class 类名
# 指定Keep类名不被混淆,且Keep的sayHello方法和成员helloStr不被混淆
-keep class 类名{
public void 方法名();
private static final java.lang.String 属性名;
}
# 指定Keepclassmembers的sayHello方法不被混淆,注意Keepclassmembers的类名仍然会被混淆
-keepclassmembers class 类名 {
public void 方法名();
}
# 通过成员来指定哪些类的类名和成员不被混淆,没有被指定的方法还是会被混淆
-keepclasseswithmembers public class 类名 {
public static void main(java.lang.String[]);
}
# 指定 keepnames 类名以及 sayHello 方法不被混淆,但需要注意的是,若 sayHello 方法未被使用,会在压缩阶段被移除掉
-keepnames public class site.hanschen.proguard.keepnames {
public void sayHello();
}
#========================基本不动区域=========================
# 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在Android里面默认是5,这条指令也只有在可以优化时起作用。)
# -op