首页 文章

Proguard keepclassmembers保持上课

提问于
浏览
2

很抱歉,如果我错过了一个可以解决此问题的回复,但我已经尝试过努力找到类似的东西 .

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

如果保留该类,我想在类中保留带注释的字段和成员 . 所以我像这样使用 keepclassmembers

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

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

-keepclassmembers [,modifier,...] 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 只是调用 MyServiceImplso it doesn't seem to be a valid reason to keep the whole class 中的另一个方法,但这是我能想到的唯一方法 .

为什么 keepclassmembers 似乎在包含指定成员的任何类上强制 keep ,而不仅仅是"if their classes are preserved as well"?但更直接, how can I keep public annotated event listeners in classes that Proguard is already keeping via other rules?

1 回答

  • 3

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

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

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

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

相关问题