# For all classes used in the program keep and obfuscate fields annotated with @ABC.
-if class *
-keepclasseswithmembers,allowobfuscation class <1> {
@ABC <fields>;
}
# Keep the class name for classes which has at least one used field annotated with @ABC.
-if class * {
@ABC <fields>;
}
-keep class <1>
如果你想让所有的类(不仅仅是程序中使用的类)都使用它,请删除第二行-if class *。 在问题中只有一个字段被注解,上述规则将只保留注解的字段。如果你想在至少有一个字段被注解的类上保留所有字段,你还必须添加以下规则:
# Keep all fields for classes which has at least one used field annotated with @ABC.
-if class * {
@ABC <fields>;
}
-keep,allowobfuscation class <1> {
<fields>;
}
最后请注意,由于类是一个Kotlin类,字段也有生成的getter和setter,这些getter和setter不受上述任何规则的约束。不幸的是,没有一种通用的方法来为被保留的字段保留getter和setter。以下规则将在至少有一个字段用@ABC注解的类上保留 all 公共getter和setter:
-if class * {
@ABC <fields>;
}
-keep class <1> {
public *** get*();
public void set*(...);
}
2条答案
按热度按时间ioekq8ef1#
请尝试以下操作:
ix0qys7i2#
如果你想把这个应用到你的程序中实际 * 使用 * 的类,你可以使用这个规则:
如果你想让所有的类(不仅仅是程序中使用的类)都使用它,请删除第二行
-if class *
。在问题中只有一个字段被注解,上述规则将只保留注解的字段。如果你想在至少有一个字段被注解的类上保留所有字段,你还必须添加以下规则:
如果注解
ABC
具有运行时保留,并且您希望该注解保留用于运行时反射,则还必须添加以下规则:最后请注意,由于类是一个Kotlin类,字段也有生成的getter和setter,这些getter和setter不受上述任何规则的约束。不幸的是,没有一种通用的方法来为被保留的字段保留getter和setter。以下规则将在至少有一个字段用
@ABC
注解的类上保留 all 公共getter和setter:然而,这个规则有一个不幸的副作用,那就是保留这些getter和setter的所有字段,所以如果你只想保留用
@ABC
注解的字段,这是行不通的。可以在不提供任何代码的情况下注解getter和setter:
这样,您就可以将初始规则更新为
只保留带注解的字段和带注解的getter和setter。