Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Proguard keepclassmembers保持类_Java_Annotations_Proguard - Fatal编程技术网

Java Proguard keepclassmembers保持类

Java Proguard keepclassmembers保持类,java,annotations,proguard,Java,Annotations,Proguard,很抱歉,如果我错过了一个可以涵盖这一点的回复,但我一直在努力寻找类似的答案 我真的被Proguard的行为弄糊涂了,我想知道我是看错了文件还是行为错了 我希望在一个类中保留带注释的字段和成员(如果保留该类的话)。所以我使用了keepclassmembers如下: -keepclassmembers class com.mycompany.** { @com.mycompany.** public com.mycompany.** *; @com.mycompany.**

很抱歉,如果我错过了一个可以涵盖这一点的回复,但我一直在努力寻找类似的答案

我真的被Proguard的行为弄糊涂了,我想知道我是看错了文件还是行为错了

我希望在一个类中保留带注释的字段和成员(如果保留该类的话)。所以我使用了
keepclassmembers
如下:

-keepclassmembers class com.mycompany.** {
    @com.mycompany.**
    public com.mycompany.** *;
    @com.mycompany.**
    public void *(com.mycompany.**);
}
(这个配置是由GUI构建的,但我想我看到了它在做什么。)

-keepclassmembers[,修饰符,…]类规范

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

听起来不错。但是我得到了输出中不期望的类,仅仅因为它们有@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已经通过其他规则保留的类中保留公共注释事件侦听器?

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

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

使用“允许”修饰符的可行配置似乎没有多大意义;我不会太相信它


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

我得出了如下可行的结论-keepclassmembers,AllowFusion类com.mycompany.*{@com.mycompany.*;}-keepclassmembers,allowshrinking,allowoptimization,AllowFusion类com.mycompany.*{@com.mycompany.*;}我认为“allow”修饰符是一种神奇的调味品,但这种组合令人困惑——似乎它撤销了整个指令。希望这能给将来的人一些想法,可能会节省他们几个小时。我作为评论发布的“工作”配置最终导致了其他问题。谢谢你的检查。最终我放弃了优化步骤。稍后我将有机会再次讨论这一点,我肯定会报告任何有健全生殖配方的情况。