gpt4 book ai didi

java - Proguard 不会保留类(class)成员的枚举

转载 作者:IT老高 更新时间:2023-10-28 20:45:35 26 4
gpt4 key购买 nike

我正在开发一个作为 java jar 分发的库,并且我正在对它运行 proguard,以便只暴露所需的接口(interface)。我有一个带有一堆成员变量和一些枚举定义的配置类。我的 proguard 脚本很好地保留了成员变量,但是,枚举定义被混淆了。我已经尝试了所有我能想到的强制 proguard 保留这些内部定义和公共(public)枚举的方法,但我无法让它工作。

我现在正在使用:

-keep public class com.stuff.MyConfigObject {
public *;
}

-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

如果我尝试:

-keep public enum com.stuff.MyConfigObject.MyEnum

我收到一个模棱两可的错误:"注意:配置引用未知类'com.stuff.MyConfigObject.MyEnum'"

感谢您的帮助!

最佳答案

改用 com.stuff.MyConfigObject$MyEnum。 Proguard class specification 期望 $ 作为内部类的分隔符。

实际上,对于您想要的,也许最好的选择是这样的:

-keep public enum com.stuff.MyConfigObject$** {
**[] $VALUES;
public *;
}

这将只保留嵌套在 MyConfigObject 中的所有 enum 所需的成员 - 所需的成员是 $VALUES[] 数组(有关解释,请参见 this question)和枚举的任何 public 成员。不会保留任何其他成员(例如私有(private)字段方法)。


正如 Jesse 和我在评论中指出的那样 - 由于您正在处理库,因此还必须添加 -keepAttributes 选项。来自 reference guide :

For example, you should at least keep the Exceptions, InnerClasses, and Signature attributes when processing a library.

关于java - Proguard 不会保留类(class)成员的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6285623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com