当前位置: 首页 > 面试题库 >

Proguard不会保留班级成员的枚举

燕扬
2023-03-14
问题内容

我正在开发一个以java
jar形式分发的库,并且在proguard上运行proguard的方式是仅保留所需的接口。我有一堆成员变量和一些枚举定义的配置类。我的proguard脚本可以很好地保留成员变量,但是混淆了枚举定义。我已经尝试过一切想使Proguard保留这些内部定义的公共枚举的方法,但是我无法使其正常工作。

现在我正在使用:

-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
类规范期望$作为内部类的分隔符。

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

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

这将仅将所有enums
的必需成员嵌套在其中MyConfigObject-必需成员是$VALUES[]数组(请参阅此问题以获取解释)和public枚举的任何成员。任何其他成员(例如私有字段方法)将不会保留。

正如Jesse和我本人在评论中指出的那样-由于您正在处理库,因此您还必须添加该-keepAttributes选项。从参考指南中:

例如,在处理库时,至少应保留Exceptions,InnerClasses和Signature属性。



 类似资料:
  • 问题内容: 您好,我正在编写一个Android应用程序,并且已经设置了Proguard来混淆我的应用程序。但是,我使用类加载器为应用程序动态加载了不同的扩展。问题在于,如果更改了它们的名称,它们将无法正确加载。如何防止Proguard混淆特定的类名? 问题答案: 使用proguard.cfg中的选项 请参阅手册 https://www.guardsquare.com/en/proguard/man

  • 问题内容: 我正在使用Java版本的Google App Engine。 我想创建一个可以接收许多类型的对象作为参数的函数。我想打印出对象的成员变量。每个对象可能不同,并且该功能必须适用于所有对象。我必须使用反射吗?如果是这样,我需要编写哪种代码? 我将如何编写函数getObject? 问题答案: 是的,您确实需要反思。它会像这样: 有关更多信息,请参见反射教程。

  • 类的成员函数是一个函数,它在类定义中的定义或原型与任何其他变量一样。 它对其所属的类的任何对象进行操作,并且可以访问该对象的类的所有成员。 让我们使用先前定义的类来使用成员函数访问类的成员,而不是直接访问它们 - class Box { public: double length; // Length of a box double breadth;

  • 每个Java类X都可以从获得其类名。 当我在JDK文档中检查它时,中没有名为的成员。 成员来自哪里?

  • 问题内容: 大多数项目的某些数据在版本之间基本上是静态的,并且非常适合用作枚举,例如状态,事务类型,错误代码等。例如,我只使用一个通用的状态枚举: 我想知道其他人在处理此类数据方面的持久性。我看到一些选择,每个选择都有明显的优点和缺点: 将可能的状态保留在状态表中,并保留所有可能的状态域对象,以供在整个应用程序中使用 只使用一个枚举,而不保留可用状态列表,这在我和我的DBA之间造成了数据一致性的圣

  • 我使用ProGuard混淆了我的代码。在代码中,我希望用下面的代码从指定的包中读取所有类。 com/test/ui/controller/b.class com/test/ui/controller/d.类 当我用一个未混淆的jar运行相同的代码时,下面是输出。包级别保存在jar中。你知道我如何告诉Proguard通过保持包级别来创建jar吗? com/test/ui/controller/d.类