class ProguardRuleTest {
public int bar;
private int foo;
public void baz() {}
}
-keep
类名以及符合声明条件的成员不会被删除和重命名。类中的其他成员会被删除、重命名;举个栗子(都假设只会应用这一条规则):
-keep class ProguardRuleTest {
public int bar;
}
类名ProguardRuleTest、变量bar不会被移除和重命名;(无条件保留,即使它们没有被引用)。而foo、baz会被移除或重命名(如果无对应引用,则成员在压缩阶段会被Remove掉;否则成员得以保留,但在混淆阶段会被重命名)
-keepname
仅在混淆阶段起作用,相当于-keep,allowshrinking
。在混淆阶段保证类名以及对应类成员不会被重命名;栗子:
-keepname class ProguardRuleTest {
public int bar;
}
应用上面的规则后,则:不保证类及类成员在压缩阶段不会被Remove;如果在压缩阶段得以保留下来,则在混淆阶段:类名不会被重命名;如果bar成员没有在压缩阶段被remove,则在混淆时同样不会被重命名。其他成员foo、baz则可能会被压缩(remove)或者重命名(rename)
-keepclassmembers
类中满足条件的成员不会被remove和rename,前提是该类没有在shrink阶段被删除,而是得以保留下来。类本身、类中其他不满足keep条件的成员可能在压缩阶段因为没有引用到而被删除,若得以保留,混淆阶段会被重命名。栗子:
-keepclassmembers class ProguardRuleTest {
public int bar;
}
若ProguardRuleTest
在压缩阶段得以保留下来,则bar
成员不会被remove以及rename,即使它本身可能没有被引用到;但类名、其他成员会被remove、rename。
-keepclassmembernames
仅在混淆阶段起作用;仅仅保证在混淆时类中满足条件的成员不会被rename,但在压缩阶段这些成员可能因为没有被使用到而被remove。类本身、类中所有成员在压缩阶段可能会因为没有引用而被Remove。若得以保留,则只有满足条件的成员不会rename,类名以及其他成员会被rename。栗子:
-keepclassmembernames class ProguardRuleTest {
public int bar;
}
若ProguardRuleTest
、bar
成员在压缩阶段均得以保留下来,则bar
成员不会被rename。
-keepclasseswithmembers
如果规则中列出的成员在类中都存在,则类和这些成员都不会被Remove以及rename,注意:必须是条件中指定的成员均存在才行,变量签名与方法签名要匹配。栗子:
-keepclasseswithmembers class ProguardRuleTest {
public int foo;
public int bar();
}
虽然foo
成员存在且匹配,但因为ProguardRuleTest
中不存在bar
方法成员,所以ProguardRuleTest
类以及类中所有成员都可能会被remove(因为没有被引用)以及rename;
-keepclasseswithmembernames
仅在混淆阶段起作用。在混淆时,如果规则中列出的成员在类中都存在,则类和这些成员都不会被rename,注意:必须是条件中指定的成员均存在才行,变量签名与方法签名要匹配。栗子:
-keepclasseswithmembernames class ProguardRuleTest {
public int foo;
public void baz();
}
在混淆时,如果foo
成员与baz
成员均得以从压缩阶段保留下来,则类名和这两个成员不会被rename;类中其他得以保留的成员仍然会被重命名;