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