android验证器源代码在哪里?

时间:2021-01-01 11:50:50

标签: android bytecode verification invokedynamic

在哪里可以找到android代码验证器的源代码?我想使用 invokedynamic,但从 android 验证程序中得到一些验证错误 (java.lang.VerifyError: Verifier rejected class ...)。我的代码可以完美地使用普通的 JVM,没有验证问题,但 android 验证程序拒绝它,我想分析它为什么会这样做。我似乎无法在网上找到验证器源代码,但如果它在我的设备上运行,它必须在某个地方。

1 个答案:

答案 0 :(得分:1)

首先,JVM 和 Android 使用完全不同的字节码格式(分别是类文件和 Dex)。虽然它们很相似,但它们都有不同的操作码和编码方法,以及不同的功能和边缘情况。有一些工具可以将一种翻译成另一种,但鉴于存在差异,您无法始终准确地翻译所有内容。

我从 2016 年左右开始就没有详细研究过 Android 字节码,但当时根本不支持调用动态*。此外,Android 有很多验证器——首先是 Dalvik,但后来太慢了,所以他们转向了 ART。它们应该行为相似,但当然,每个都是独立的代码库,有自己的各种错误。 (顺便说一下,在 JVM 端还有 两个验证器,旧的基于推理的验证器和新的堆栈映射验证器,它们也 有自己的错误,尽管通常没有那么多,因为没有 Android 发展得那么快)。

无论如何,看起来 ART 验证器源代码是 here

*编辑:看起来 Android 已经添加了 invoke-custom 操作码,它的 invokedynamic 等效项。与 Dex 的所有事物一样,两者之间也存在细微差别。

相关问题