Java 启用GUI的应用程序的Proguard优化(无混淆)后发生ClassFormatError

Java 启用GUI的应用程序的Proguard优化(无混淆)后发生ClassFormatError,java,exception,guice,proguard,Java,Exception,Guice,Proguard,我有一个支持Guice的应用程序运行良好,但当我使用Proguard优化它(即收缩大小)时,我得到以下错误消息(我使用未捕获的异常处理程序捕获它): 这会阻止应用程序正常运行。我没有混淆代码 有人知道发生了什么吗?是否有解决方案/解决方法 谢谢。有时ProGuard会在收缩时撕下比它应该撕的更多的东西。ProGuard将删除它认为未在应用程序中使用的对类/成员的任何引用,除非您明确告诉它保留这些类/成员 可以使用保留类/成员。有几个保持选项的示例 我看到有时当我的应用程序引用一个接口实现时会发生

我有一个支持Guice的应用程序运行良好,但当我使用Proguard优化它(即收缩大小)时,我得到以下错误消息(我使用未捕获的异常处理程序捕获它):

这会阻止应用程序正常运行。我没有混淆代码

有人知道发生了什么吗?是否有解决方案/解决方法


谢谢。

有时ProGuard会在收缩时撕下比它应该撕的更多的东西。ProGuard将删除它认为未在应用程序中使用的对类/成员的任何引用,除非您明确告诉它保留这些类/成员

可以使用保留类/成员。有几个保持选项的示例


我看到有时当我的应用程序引用一个接口实现时会发生这种情况,而当您只是查看代码时,它似乎没有被引用。我只是在每次发现缺少某些内容时添加一个新的保留选项。也许其他人有更好的建议来追踪这些信息?

在撰写本文时,请确保您使用的是最新版本的ProGuard,版本4.6

但是,根据其他报告,在优化步骤中可能仍然存在一个bug(#3161222),并不总是正确处理可选的LocalVariableTable和LocalVariableTypeTable属性。因此,有三个简单的解决办法:

  • 编译时不使用这些属性(javac-g:lines,source),或者
  • 让模糊处理步骤删除属性(不要指定-dontobfuscate,不要指定-keepattributes LocalVariableTable,LocalVariableTypeTable),或者
  • 不要优化(-dontoptimize)
这些属性用于调试,在模糊代码中通常不是很有用,甚至不可取

试试这个:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod 
-optimizations !code/allocation/variable

我尝试了不同的选项来删除有问题的类,但我一直遇到问题。我终于从我的代码中删除了Guice,收缩现在工作得非常好。这个应用程序又开始工作了。我确实使用了4.6版。如果您愿意,我可以创建一个小型maven项目来复制该问题,并将其放在pastebin上。请告诉我。@JVerstry谢谢你的提议。我认为从以前的报告中可以看出,目前的情况是可行的。
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod 
-optimizations !code/allocation/variable