我正在尝试使用Proguard处理MS Windows桌面应用程序(使用Eclipse提供的SWT lib的Java 6 SE)。我收到以下严重错误:
Unexpected error while performing partial evaluation:
Class = [org/eclipse/swt/widgets/DateTime]
Method = [<init>(Lorg/eclipse/swt/widgets/Composite;I)V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/lang/StringBuffer] and [org/eclipse/swt/internal/win32/TCHAR])
Error: Can't find common super class of [java/lang/StringBuffer] and [org/eclipse/swt/internal/win32/TCHAR]
----------------------------
当我尝试Google的错误时,它只出现在整个网络上的两个位置,这让我非常惊讶。 我是新手,使用Proguard和Java代码优化工具。 任何想法和建议如何解决这个问题,将不胜感激。提前谢谢。
以上错误已修复,,使用“-dontskipnonpubliclibraryclasses”
- 最终更新:
我现在还有另一个错误。 整个输出现在如下:
D:\eclipse_projs\java_obfuscate\gci>gci.bat
ProGuard, version 4.4
Reading program jar [D:\eclipse_projs\java_obfuscate\gci\gci.jar]
Reading library jar [D:\jre1.6.0_07\lib\rt.jar]
Unexpected error while evaluating instruction:
Class = [org/eclipse/swt/widgets/Synchronizer]
Method = [runAsyncMessages(Z)Z]
Instruction = [60] aload_1 v1
Exception = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue])
Unexpected error while performing partial evaluation:
Class = [org/eclipse/swt/widgets/Synchronizer]
Method = [runAsyncMessages(Z)Z]
Exception = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue])
Error: Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue]
D:\eclipse_projs\java_obfuscate\gci>
这是一个我无法理解的问题:(任何帮助都会非常感激。
我使用的选项如下:
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-optimizationpasses 3
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-dontnote
答案 0 :(得分:7)
尝试将选项-dontskipnonpubliclibraryclasses
添加到命令行。
限制
为提高效率, ProGuard总是忽略任何私人或 打包可见的库类 阅读图书馆的罐子。如果有的话 由公共图书馆扩展 类,然后再次扩展 输入类,ProGuard会抱怨 它找不到它们。在这种情况下, 你必须使用-dontskipnonpubliclibraryclasses
选项,甚至可能是-dontskipnonpubliclibraryclassmembers
选项。图形用户界面 有这些设置的复选框。
答案 1 :(得分:1)
我遇到了同样的问题,但没有尝试指定-dontskipnonpubliclibraryclasses
或任何其他选项来修复。我的问题发生在java.lang.StringBuffer
课上,这非常奇怪。整个项目正在使用StringBuffer
类,其他任何地方都没有出现错误。
要修复,我所做的只是移动StringBuffer
的范围。
旧代码 - 错误:
function(){
if(condition){
StringBuffer buffer = new StringBuffer();
//additional code
}else if(condition){
StringBuffer buffer = new StringBuffer();
//additional code
}
}
新代码 - 没有问题。
function(){
StringBuffer buffer = new StringBuffer();
if(condition){
//additional code
}else if(condition){
//additional code
}
}
我有一种感觉,这必须与ProGuard有关,以及它如何解析代码。
答案 2 :(得分:0)
尝试删除-dontnote
选项。您可能有重复的定义,但没有收到警告,或者您可能忽略了警告。
答案 3 :(得分:0)
我的应用程序存在问题,具体取决于其他各种项目。我尝试了列出的解决方案,但没有一个有用。根据测试,收缩和预验证步骤正确运行,优化抛出错误:
> java.io.IOException: java.lang.IllegalArgumentException: Can't find common super class of [java/io/File] (with 2 known super classes) and [org/antlr/v4/runtime/tree/gui/TreeViewer] (with 1 known super classes)
我尝试保留(-keep options)这两个类没有任何成功。 基于其他线程,我发现最小的解决方案是禁用变量优化:
-optimizations !code/allocation/variable
这让我成功编译,但有其缺点。