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 使用了更严格的验证,并为类引入了堆栈映射来验证代码。所以在我的混淆过程中,这个地图似乎被破坏了,因为只有这个异常发生,当我用 proguard 混淆我的项目时。

使用-XX:-UseSplitVerifier禁用验证并启动构建的 jar 会有所帮助,但我不确定这是否应该是处理此问题的方法。

所以我想知道是否还有其他人有类似的错误?或者是否有人甚至可能知道解决此问题的特定方法,例如通过调整混淆过程的 proguard 配置?

4

3 回答 3

29

我假设您没有指定-dontpreverify?该选项几乎肯定会导致这些错误,因为它将阻止 ProGuard 更新 StackMapTable 属性。该属性在 Java 6 中是可选的,但在 Java 7 中是必需的。

您仍然可以尝试 ProGuard 4.11 的 beta 版本,但它不太可能在这里有所作为。如果你把处理后的类文件邮寄给我,我会调查的。

(我是 ProGuard 的开发者)

于 2013-11-12T19:13:36.757 回答
0

如果你们还没有找到解决方案,您可以尝试检查是否有-microedition选项。就是它与StackMap. 删除此选项为我解决了这个问题。

于 2016-01-05T11:25:52.270 回答
0

在将我的应用程序从 1.6 迁移到 1.7 时,我也面临同样的挑战。经过巨大的努力,我们找到了解决该问题的方法。

方法 1:您可以使用 -XX:-UseSplitVerifier 参数来解决此问题,您无需担心升级库文件。

方法 2:我已按照以下步骤解决此问题。第 1 步:确定并保留应用程序使用的外部库列表。第 2 步:确定列表后,继续逐个删除外部库文件并插入升级版本的库文件,这将帮助您隔离可能导致问题的库。在我的情况下:j2ee.jar 和 openjpa-1.2.2 jar 文件创建了一个问题,然后我升级了这些解决了迁移问题的库。

因此,找出导致问题的库并将其逮捕是一个缓慢而痛苦的过程。

我希望,这些信息可能有用,因为它基于我的实时经验。

于 2016-06-09T22:57:37.650 回答