很抱歉,如果我错过了一个可以解决这个问题的回复,但我一直在努力寻找类似的东西。
我真的对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已经通过其他规则保留的类中保留公共注释事件监听器?
答案 0 :(得分:3)
您的初始配置和解释看起来是正确的。如果我在一个简单的例子中尝试它也可以工作:如果已经保留了类,则保留带注释的字段和方法。当然,那些带注释的方法可能包含拖入更多类的代码。
-whyareyoukeeping的输出只能说明故事的一半,在这种情况下不是很有帮助。您可以检查-printseeds是否提供了一些提示。
使用'allow'修饰符的可行配置似乎没有多大意义;我不会太相信。
如果你仍然认为存在错误,可以在ProGuard bug tracker中报告,最好是一个允许我重现问题的示例。