12

我正在尝试使用 Proguard 处理 MS Windows 桌面应用程序(使用 Eclipse 提供的 SWT 库的 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]
----------------------------

当我试图用谷歌搜索这个错误时,它只出现在整个网络上的两个地方,这让我大吃一惊。我完全是使用 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
4

4 回答 4

7

尝试将选项添加-dontskipnonpubliclibraryclasses到命令行。

来自Proguard 手册

限制

为了提高效率,ProGuard 在读取库 jar 时总是忽略任何私有或包可见的库类。如果它们中的任何一个被公共库类扩展,然后又被输入类扩展,ProGuard 将抱怨它找不到它们。在这种情况下,您将不得不使用该 -dontskipnonpubliclibraryclasses 选项,甚至可能是该 -dontskipnonpubliclibraryclassmembers选项。图形用户界面具有这些设置的复选框。

于 2010-04-07T10:40:28.780 回答
2

根据其他各种项目,我遇到了一个应用程序问题。我尝试了列出的解决方案,但没有一个有帮助。根据测试,收缩和预验证步骤运行正确,优化抛出错误:

> 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 选项)这两个类都没有成功。基于其他线程,我发现最小的解决方案是禁用变量优化:

-optimizations !code/allocation/variable

这让我可以成功编译,但也有它的缺点。

于 2017-10-11T19:00:25.153 回答
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 以及它如何解析代码有关。

于 2012-05-02T12:55:59.157 回答
1

尝试删除该-dontnote选项。您可能有没有收到警告的重复定义,或者您可能忽略了警告。

于 2010-04-07T10:46:21.923 回答