我有一个启用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
这可以防止应用程序正常运行。我不会混淆代码。
有谁知道发生了什么?有解决方案/解决方法吗?
感谢。
答案 0 :(得分:4)
在撰写本文时,请确保您使用的是最新版本的ProGuard 4.6版。
根据其他报告,优化步骤中仍可能存在错误(#3161222),并不总是正确处理可选的LocalVariableTable和LocalVariableTypeTable属性。因此,有三种简单的解决方法:
这些属性用于调试,通常在模糊代码中不是非常有用或甚至是不可取的。
答案 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