Proguard keepclassmembers保持上课

时间:2012-03-17 17:36:20

标签: java annotations proguard

很抱歉,如果我错过了一个可以解决这个问题的回复,但我一直在努力寻找类似的东西。

我真的对Proguard的行为感到困惑,我想知道我是否正在阅读文档错误或行为是否错误。

如果要保留该类,我希望在类中保留带注释的字段和成员。所以我使用keepclassmembers就像这样:

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

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

  

-keepclassmembers [,修饰符,...] class_specification

     

指定要保留的类成员(如果还保留了它们的类)。例如,您可能希望保留实现Serializable接口的类的所有序列化字段和方法。

听起来不错。但是我在输出中得到了我不期望的类,只是因为他们有@annotated听众。 -whyareyoukeeping class 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包含指定成员的任何类,而不仅仅是“如果他们的类也被保留”?但更直接的是,如何在Proguard已经通过其他规则保留的类中保留公共注释事件监听器?

1 个答案:

答案 0 :(得分:3)

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

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

使用'allow'修饰符的可行配置似乎没有多大意义;我不会太相信。

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