java - Proguard keepclassmembers 保持类(class)

标签 java annotations proguard

很抱歉,如果我错过了涵盖此问题的回复,但我已尽力寻找类似的内容。

我对 Proguard 的行为感到非常困惑,我想知道我是否读错了文档或者行为是否错误。

我想保留类中带注释的字段和成员(如果保留该类)。所以我像这样使用 keepclassmembers :

-keepclassmembers class com.mycompany.** {
    @com.mycompany.**
    public com.mycompany.** *;
    @com.mycompany.**
    public void *(com.mycompany.**);
}

(这个配置是由 GUI 构建的,但我想我明白它在做什么。)Proguard 文档说

-keepclassmembers [,modifier,...] class_specification

Specifies class members to be preserved, if their classes are preserved as well. For example, you may want to keep all serialization fields and methods of classes that implement the Serializable interface.

听起来不错。但我在输出中得到了我不期望的类,只是因为它们有 @annotated 监听器。 -为什么要保留类 com.company.MyServiceImpl

com.mycompany.MyServiceImpl
  is invoked by    com.mycompany.MyServiceImpl: void handleEvent(com.mycompany.MyEvent) (34:35)
  is kept by a directive in the configuration.

handleEvent 只是调用了 MyServiceImpl 中的另一个方法,因此这似乎不是保留整个类的正当理由,但是这是我唯一能想到的。

为什么 keepclassmembers 似乎强制 keep 包含指定成员的任何类,而不仅仅是“如果它们的类也被保留”?但更直接的是,如何将公共(public)带注释的事件监听器保留在 Proguard 已通过其他规则保留的类中?

最佳答案

您的初始配置和对它的解释看起来是正确的。如果我尝试一个简单的示例,它也可以工作:如果已保留带注释的字段和方法,则保留它们的类。当然,那些带注释的方法可能包含拖入更多类的代码。

-whyareyoukeeping 的输出只说明了故事的一半,在这种情况下没有多大帮助。您可以检查 -printseeds 是否提供了一些提示。

带有“allow”修饰符的可行配置似乎没有多大意义;我不会太相信它。

如果您仍然认为存在错误,可以在 ProGuard bug tracker 中报告。 ,最好有一个可以让我重现问题的示例。

关于java - Proguard keepclassmembers 保持类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9752208/

相关文章:

java - XML Xpath 获取元素的最后一个子元素

java - 如何将一个 HTML 片段转换为另一个 HTML 片段?

android - Kotlin 对 @ColorInt Java 注释的支持

java - JPA 获取急于条件

gradle - 如何禁用外部依赖 jar 的 Proguard 设置?

java - 这段 Java 代码如何转换 ip 地址?

java - 如果没有用Gson初始化如何不写float(GsonBuilder())

android - Unity proguard:任务 ':transformClassesAndResourcesWithProguardForRelease'的执行失败

java - 使通用类型可用的注释

java - 在JavaFX应用程序上运行Proguard后出现NoClassDefFoundError