class ProguardRuleTest {
public int bar;
private int foo;
public void baz() {}
}
-keep
類名以及符合聲明條件的成員不會被刪除和重命名争拐。類中的其他成員會被刪除茄茁、重命名鹰祸;舉個栗子(都假設(shè)只會應(yīng)用這一條規(guī)則):
-keep class ProguardRuleTest {
public int bar;
}
類名ProguardRuleTest仆抵、變量bar不會被移除和重命名跟继;(無條件保留,即使它們沒有被引用)镣丑。而foo舔糖、baz會被移除或重命名(如果無對應(yīng)引用,則成員在壓縮階段會被Remove掉传轰;否則成員得以保留剩盒,但在混淆階段會被重命名)
-keepname
僅在混淆階段起作用,相當(dāng)于-keep,allowshrinking
慨蛙。在混淆階段保證類名以及對應(yīng)類成員不會被重命名辽聊;栗子:
-keepname class ProguardRuleTest {
public int bar;
}
應(yīng)用上面的規(guī)則后,則:不保證類及類成員在壓縮階段不會被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
如果規(guī)則中列出的成員在類中都存在,則類和這些成員都不會被Remove以及rename镣典,注意:必須是條件中指定的成員均存在才行兔毙,變量簽名與方法簽名要匹配。栗子:
-keepclasseswithmembers class ProguardRuleTest {
public int foo;
public int bar();
}
雖然foo
成員存在且匹配兄春,但因為ProguardRuleTest
中不存在bar
方法成員澎剥,所以ProguardRuleTest
類以及類中所有成員都可能會被remove(因為沒有被引用)以及rename;
-keepclasseswithmembernames
僅在混淆階段起作用赶舆。在混淆時哑姚,如果規(guī)則中列出的成員在類中都存在,則類和這些成員都不會被rename芜茵,注意:必須是條件中指定的成員均存在才行叙量,變量簽名與方法簽名要匹配。栗子:
-keepclasseswithmembernames class ProguardRuleTest {
public int foo;
public void baz();
}
在混淆時九串,如果foo
成員與baz
成員均得以從壓縮階段保留下來绞佩,則類名和這兩個成員不會被rename;類中其他得以保留的成員仍然會被重命名猪钮;