Proguard - 找不到常见的超类/ java.lang.VerifyError [英] Proguard - Can't find common super class / java.lang.VerifyError

查看:1910
本文介绍了Proguard - 找不到常见的超类/ java.lang.VerifyError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在开发桌面应用程序。使用以下配置标志在代码上运行ProGuard(版本5.3.3)时:

We are developing a desktop application. When running ProGuard (version 5.3.3) on the code using the following configuration flags:

-dontoptimize
-allowaccessmodification
-dontusemixedcaseclassnames
-dontwarn

Proguard给出以下错误:

Proguard gives the following error:

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)

如果将-dontpreverify标志添加到配置中,则构建将成功。但是,当运行jar文件时,我们会收到以下错误:

If the flag -dontpreverify is added to the configuration the build will succeed. However when running the jar-file we then get the following error:

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可以避免这种情况。阅读主题:

Which can be avoided by using the JVM flag -noverify. Reading the thread:

模糊处理导致VerifyError:期望堆栈图框架

如果可能,我们希望避免使用这些无验证标记。

We would like to avoid these 'no verification' flags if possible.

注意:即使添加

-dontobfuscate
-dontshrink


推荐答案

你指的是选项 -dontwarn 禁止有关未解析引用的警告。这可能会在处理代码时导致问题。 ProGuard需要这些参考,例如在预验证步骤中。该错误确实表明输入不包含所有必需的依赖项: ImmutableList UnmodifiableIterator 的一些常见超类或接口不见了。对于桌面应用程序,您应检查是否指定了包含所有必需类的Java运行时jar:

You're specifying the option -dontwarn to suppress warnings about unresolved references. This can lead to problems while processing the code. ProGuard needs those references, e.g. in the preverification step. The error indeed suggests that the input doesn't contain all necessary dependencies: some common superclass or interface of ImmutableList and UnmodifiableIterator is missing. For a desktop application, you should check that you're specifying a Java runtime jar with all the necessary classes:

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

请参阅ProGuard手册>故障排除> 警告:找不到超类或界面

See the ProGuard manual > Troubleshooting > Warning: can't find superclass or interface

这篇关于Proguard - 找不到常见的超类/ java.lang.VerifyError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆