如果类包含带注释的字段,我如何配置proguard/R8以保留该类的所有字段和方法?
我有一个类
public class MyDocument {
@DocumentId
private String foo;
private String bar;
public getFoo() { .. }
public getBar() { .. }
}
我能够使它不删除带有的foo
-keepclassmembers class * {
@a.b.c.DocumentId <fields>;
@a.b.c.DocumentId <methods>;
}
但它仍然删除了getBar((
有没有办法说";如果同一类中的某个字段包含注释,则不要删除该类中的任何方法或字段?
这里的用例是它们是firestore的toObject
使用的DTO类。我不想根据类的名称进行匹配,因为这个规则将应用于许多类。
您应该能够使用这样的条件规则:
-if class * {
@a.b.c.DocumentId *** *;
}
-keep class <1> {
*;
}
确切地说,如果一个类有一个带注释的字段,那么保留该类的所有成员。
我刚刚读到关于-keepclasseswithmembers
的文章,它相当于根据类的内容推断出的@Keep
:
-keepclasseswithmembers class * {
@a.b.c.DocumentId <fields>;
}
真正归结为-keepclassmembers
的一个更严格的替代方案是用r8可以检测到的东西来注释DTO(例如,retention=runtime的注释(,然后只针对规则中的注释:
-keepclassmembers @a.b.c.Dto class *