启用Guice的应用程序的Proguard优化(无混淆)后的ClassFormatError

时间:2011-05-20 03:10:35

标签: java exception guice proguard

我有一个启用Guice的应用程序正常工作,但是当我使用Proguard优化它(即缩小大小)时,我收到以下错误消息(我用未捕获的异常处理程序捕获它):

java.lang.ClassFormatError: LVTT entry for 'that' in class file
com/google/inject/internal/util/$ImmutableList$RegularImmutableList
does not match any LVT entry

这可以防止应用程序正常运行。我不会混淆代码。

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

感谢。

3 个答案:

答案 0 :(得分:4)

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

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

  • 编译时没有这些属性(javac -g:lines,source)或
  • 让混淆步骤删除属性(不指定-dontobfuscate,不指定-keepattributes LocalVariableTable,LocalVariableTypeTable)或
  • 不要优化(-dontoptimize)。

这些属性用于调试,通常在模糊代码中不是非常有用或甚至是不可取的。

答案 1 :(得分:1)

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

您可以使用ProGuard's keep options保留班级/成员。 example usage page有一些保留选项的例子。

我发现,当我的应用程序引用一个接口实现时,有时会发生这种情况,当您只是查看代码时,该接口实现似乎没有被引用。我每次发现缺少某些东西时都会添加一个新的保留选项。也许其他人对如何跟踪这些事情提出了更好的建议?

答案 2 :(得分:-1)

试试这个:

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