2017-07-31 23 views
11

私たちはデスクトップアプリケーションを開発しています。次の設定フラグを使用してコードにProGuardの(バージョン5.3.3)を実行する場合:フラグは、ビルド構成に追加される-dontpreverify場合Proguard - 共通のスーパークラス/ java.lang.VerifyErrorが見つかりません

Unexpected error while performing partial evaluation: 
    Class  = [com/code/backend/e/b/b] 
    Method  = [b(Ljava/lang/String;)Ljava/nio/file/Path;] 
    Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes)) 
Unexpected error while preverifying: 
    Class  = [com/code/backend/e/b/b] 
    Method  = [b(Ljava/lang/String;)Ljava/nio/file/Path;] 
    Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes)) 


FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task 'proguard'. 
> Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes) 

-dontoptimize 
-allowaccessmodification 
-dontusemixedcaseclassnames 
-dontwarn 

ProGuardの次のエラーを与えます成功します。

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 11 
Exception Details: 
    Location: 
    com/code/code2/MainWindow.b(Lcom/code/code2/ClientAPIProtos$SoftwareStatus;)V @1: ifnull 
    Reason: 
    Expected stackmap frame at this location. 
    Bytecode: 
    0x0000000: 2bc6 000a 2ab4 00bc c700 04b1 2bb2 00a4 
    0x0000010: a500 0a2b b800 f599 0018 2ab4 00bc b601 
    0x0000020: 9299 0020 2ab4 00bc 03b6 0193 a700 152a 
    0x0000030: b400 bcb6 0192 9a00 0b2a b400 bc04 b601 
    0x0000040: 932b b800 f699 0012 1225 4db8 0138 4e2a 
    0x0000050: 04b5 00c8 a700 0f12 1e4d b801 3a4e 2a03 
    0x0000060: b500 c82a b400 bcb6 0191 3a04 1904 c600 
    0x0000070: 0c2c 1904 b601 799a 000b 2ab4 00bc 2cb6 
    0x0000080: 0195 2ab4 00bc b601 903a 0519 05c6 0009 
    0x0000090: 2d19 05a5 000b 2ab4 00bc 2db6 0194 b1 

    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048) 
    at java.lang.Class.getMethod0(Class.java:3018) 
    at java.lang.Class.getMethod(Class.java:1784) 
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) 

JVMフラグ-noverifyを使用することによって回避することができます。jarファイルを実行しているしかし、ときに我々は次のエラーを取得します。スレッドを読む:

Obfuscation causes VerifyError: Expecting a stackmap frame

我々は、可能な場合は、これらの「ノー検証」フラグを避けたいです。

注:ビルドエラーが初期化、検証、および検証が建築プロジェクトの一部である

-dontobfuscate 
-dontshrink 

答えて

6

未解決の参照に関する警告を抑制するには、オプション-dontwarnを指定しています。これにより、コードを処理する際に問題が発生する可能性があります。 ProGuardはこれらの参照を必要とします。事前確認段階でこのエラーは、入力に必要な依存関係がすべて含まれていないことを示しています。ImmutableListとUnmodifiableIteratorの共通のスーパークラスまたはインタフェースがありません。デスクトップアプリケーションの場合は、あなたが必要なすべてのクラスとJavaランタイムjarファイルを指定していることを確認する必要があります

-libraryjars <java.home>/lib/rt.jar 

は、ProGuardのマニュアルを参照してください>トラブルシューティング>Warning: can't find superclass or interface

ProGuardのは、印刷することができる
2

を追加する場合にも発生します。私は旗 - 寛大な改造は、プロジェクトを構築する際に変更を許可すること、つまりクラスが元の構造から変更されていると考えています。元のクラス構造がスタックよりも変更されると、フレームが乱されます。これは検証の失敗につながります。前述のように、検証エラーを無視したい場合は、確認を中断するフラグを使用する必要があります。

1

Troubleshooting

注:動的に参照されるクラスは見つかりません ProGuardはコードがアクセスしているクラスまたはインターフェイスを平均で見つけることができませんsのイントロスペクション。このクラスを含むjarを追加するかどうかを確認する必要があります。

注:ProGuardは、 "(MyClass)Class.forName(variable)"のように、動的に作成されたクラスインスタンスのすべてのクラスキャストをリストしています。 .newInstance() "アプリケーションによっては、上記のクラスを "-keep class MyClass"のようなオプションで保持するか、 "-keep class *がMyClassを実装する"のようなオプションを実装する必要があります。 -dontnoteオプションを指定することにより、これらのノートをオフにすることができます。

注:フィールド/メソッド '...'に動的にアクセスします ProGuardは、「。getField( "myField")」のようないくつかの構造をリストしています。アプリケーションによっては、前述のクラスメンバーがどこに定義されているか把握し、 "-keep class MyClass {MyFieldType myField;}"のようなオプションでそれらを保持する必要があります。それ以外の場合、ProGuardはクラスメンバーを正確に認識できないため、クラスメンバーを削除または難読化する可能性があります。あなたの情報のために候補者候補をリストアップします。 -dontnoteオプションを指定することにより、これらのノートをオフにすることができます。

関連する問題