使用 ProGuard,使用通配符保留 class 字段

Using ProGuard, keep class fields with wildcard

如果字段名称以特定字符串开头,我希望某些 class 字段不被 ProGuard 触及。目前我只是设置要保留的所有字段,但想改进它以保留 all public 和受保护的字段,并且只保留以此字符串开头的私有字段.

这是我的当前配置 pom.xml:

<option>-keepclassmembers class com.my.package.** { &lt;fields&gt;; }</option>

我尝试了以下和类似的变体:

<option>-keepclassmembers class com.my.package.** { public *; protected *; private string***; }</option>

但是 ProGuard 抛出一个错误(当我只使用 "private *;" 时工作正常):

[proguard] Error: Expecting class member name before ';' in argument number 39

我猜是我使用的通配符不正确,或者这无法完成?我已经通过 Google 检查了 ProGuard 站点的 usage/examples 部分和其他示例,我发现通常可能需要该字段的完整定义(private final String stringVariable), 但我不是 100% 确定。

该模式看起来像 Java,但带有通配符。您可以使用以下内容:

-keepclassmembers class com.my.package.** {
    public protected <fields>;
    private *** string*;
}

通配符 <fields> 匹配所有字段(任何类型,任何名称),在本例中限制为仅匹配 public 或受保护的字段。

下一行,通配符***匹配任何类型(包括原始类型和数组类型),表达式string*匹配任何以'string'开头的名称,在本例中进一步限制在私人领域。

如果有用,您可以向这两行添加其他约束,例如 !static 以仅匹配非静态字段。