我有一个即将使用ProGuard进行混淆的库。"库模式"几乎适用于我的用例,也就是说,保留所有公共和受保护的类和类成员几乎是可以的。然而,由于Java的可见性要求,一些成员不能被设置为包私有或私有,因此它们是公共类,尽管它们不应该在库中。我想让他们混淆,使它更清楚,这些类不属于公共api,以及得到更好的混淆和更小的库jar。是否有一种方法可以从proguard "keep"规则中排除某些项,而无需通过名称(使用'!')指定每个项。理想情况下,我希望用标记注释来注释这些类和成员,但据我所知,Proguard只能被告知保留具有特定注释的项。
您确实只能保留项。如果您想要排除某些类成员,您必须通过列出或注释您想要保留的类成员来做到这一点。在指定类名时,您可以提供一个列表,可选地使用"!"来排除名称。当指定类成员名和类型时,这是不可能的。不过,在这两种情况下,都可以使用通配符。如果您为内部类选择特殊的名称,这可能会起作用:
-keep public class * {
public protected *** !myInternalField*;
public protected *** !myInternalMethod*(...);
}