如果字段名称以某个字符串开头,我想让ProGuard保持某些类字段不变。目前,我只是将所有字段设置为保留,但想对其进行优化以保留所有公共和受保护的字段,并且仅保留以该字符串开头的私有字段。
这是我的pom.xml中的当前配置:
<option>-keepclassmembers class com.my.package.** { <fields>; }</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网站的“用法/示例”部分以及其他示例,并且通常会看到该字段的完整定义(私有最终String stringVariable),但我不确定100%。
最佳答案
该模式看起来像Java,但带有通配符。您可以使用以下内容:
-keepclassmembers class com.my.package.** {
public protected <fields>;
private *** string*;
}
通配符
<fields>
匹配所有字段(任何类型,任何名称),在这种情况下,仅可匹配公共或受保护的字段。在下一行,通配符
***
匹配任何类型(包括基本类型和数组类型),表达式string*
匹配任何以'string'开头的名称,在这种情况下,进一步限制为私有字段。如果有用,您可以在两行中添加其他约束,例如
!static
以仅匹配非静态字段。