15

最新の JDK 7 (u45) と ProGuard バージョン 4.10 を使用しています。

最近、ディストリビューションを難読化した後、次のエラーでディストリビューションを開始できませんでした。

Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at
branch target 155
Exception Details:
  Location:
    com/bla/bla/service/ioc/SpringBootstrap.c()V @0: getstatic
  Reason:
    Expected stackmap frame at this location.
  Bytecode:
    0000000: b200 73b6 008b 9900 82b2 0073 b800 933b
    0000010: 1a99 0074 b200 73b6 008d 9900 6bb2 0074
    0000020: 1221 b600 cfb8 0092 4c2b b600 9c12 1db9
    ...
  Exception Handler Table:
    bci [0, 152] => handler: 155

        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

StackOverflow でこのトピックに関するいくつかの議論を見つけました。

私が理解したところによると、Java 7 はより厳密な検証を使用し、コードを検証するためにクラスのスタック マップを導入しました。したがって、プロジェクトをプロガードで難読化すると、この例外のみが発生するため、難読化プロセス中に何らかの形でこのマップが破損しているように見えます。

-XX:-UseSplitVerifierで検証を無効にし、ビルドされた jar を開始すると役立ちますが、それがこの問題を処理する方法であるかどうかはよくわかりません。

それで、他の誰かが同様のエラーを起こしたのだろうか?または、難読化プロセスのプロガード構成を調整するなど、これを解決する特定の方法を誰かが知っている場合は?

4

3 に答える 3

29

-dontpreverify を指定していないと思いますか? このオプションは、ProGuard による StackMapTable 属性の更新を停止するため、ほぼ確実にこれらのエラーにつながります。この属性は Java 6 ではオプションでしたが、Java 7 では必須です。

ProGuard 4.11 のベータ版を試すこともできますが、ここで違いが生じる可能性は低いです。処理済みのクラス ファイルをメールで送っていただければ、調べます。

(私は ProGuard の開発者です)

于 2013-11-12T19:13:36.757 に答える
0

まだ解決策が見つからない場合は、-microeditionオプションがあるかどうかを確認してみてください。に関連する理由は次のStackMapとおりです。このオプションを削除すると、この問題が修正されました。

于 2016-01-05T11:25:52.270 に答える