【问题标题】:Using ProGuard, keep class fields with wildcard使用 ProGuard,使用通配符保留类字段
【发布时间】:2017-04-30 23:32:06
【问题描述】:

如果字段名称以某个字符串开头,我想保持某些类字段不受 ProGuard 影响。目前我只是设置要保留的所有字段,但想改进它以保留 all 公共和受保护的字段,并且只保留以该字符串开头的私有字段。

这是我 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 站点的用法/示例部分和其他示例,我发现通常可能需要该字段的完整定义(private final String stringVariable),但我不是100% 确定。

【问题讨论】:

    标签: java maven proguard


    【解决方案1】:

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

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

    通配符&lt;fields&gt; 匹配所有字段(任何类型、任何名称),在这种情况下仅限于匹配公共或受保护字段。

    在下一行,通配符*** 匹配任何类型(包括原始类型和数组类型),表达式string* 匹配任何以“字符串”开头的名称,在这种情况下进一步限制为私有字段。

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

    【讨论】:

    • 谢谢,我想这就是我要找的。将在第二天左右对其进行测试并返回结果。 :)
    • 完美运行。干杯。 :)
    • 有通配符的文档吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2012-06-13
    • 2018-05-10
    • 2012-07-06
    • 2016-05-02
    相关资源
    最近更新 更多