proguard rule

2018-08-13  本文已影响22人  chandarlee
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;
}

ProguardRuleTestbar成员在压缩阶段均得以保留下来,则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;类中其他得以保留的成员仍然会被重命名;

上一篇 下一篇

猜你喜欢

热点阅读