在哪里可以找到android代码验证器的源代码?我想使用 invokedynamic
,但从 android 验证程序中得到一些验证错误 (java.lang.VerifyError: Verifier rejected class ...
)。我的代码可以完美地使用普通的 JVM,没有验证问题,但 android 验证程序拒绝它,我想分析它为什么会这样做。我似乎无法在网上找到验证器源代码,但如果它在我的设备上运行,它必须在某个地方。
答案 0 :(得分:1)
首先,JVM 和 Android 使用完全不同的字节码格式(分别是类文件和 Dex)。虽然它们很相似,但它们都有不同的操作码和编码方法,以及不同的功能和边缘情况。有一些工具可以将一种翻译成另一种,但鉴于存在差异,您无法始终准确地翻译所有内容。
我从 2016 年左右开始就没有详细研究过 Android 字节码,但当时根本不支持调用动态*。此外,Android 有很多验证器——首先是 Dalvik,但后来太慢了,所以他们转向了 ART。它们应该行为相似,但当然,每个都是独立的代码库,有自己的各种错误。 (顺便说一下,在 JVM 端还有 两个验证器,旧的基于推理的验证器和新的堆栈映射验证器,它们也 有自己的错误,尽管通常没有那么多,因为没有 Android 发展得那么快)。
无论如何,看起来 ART 验证器源代码是 here。
*编辑:看起来 Android 已经添加了 invoke-custom
操作码,它的 invokedynamic
等效项。与 Dex 的所有事物一样,两者之间也存在细微差别。