12

MS Windows デスクトップ アプリケーション (Eclipse が提供する SWT ライブラリを使用する Java 6 SE) を Proguard で処理しようとしています。そして、次の重大なエラーが発生します。

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 で検索してみると、ウェブ全体で 2 か所しか出てこず、非常に驚​​きました。私は、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 は、ライブラリ jar の読み取り中に、プライベートまたはパッケージの可視ライブラリ クラスを常に無視します。それらのいずれかがパブリック ライブラリ クラスによって拡張され、入力クラスによって再度拡張された場合、ProGuard はそれらが見つからないと文句を言います。その場合、 オプションを使用する必要があり、場合によっては-dontskipnonpubliclibraryclasses オプション を使用する必要があり-dontskipnonpubliclibraryclassmembersます。グラフィカル ユーザー インターフェイスには、これらの設定用のチェックボックスがあります。

于 2010-04-07T10:40:28.780 に答える
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 に答える