2

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

4

1 回答 1

1

首先,JVM 和 Android 使用完全不同的字节码格式(分别是类文件和 Dex)。尽管它们相似,但它们各自具有不同的操作码和编码方法,以及不同的功能和边缘情况。有一些工具可以将一个翻译成另一个,但考虑到差异,你不能总是准确地翻译所有内容。

自 2016 年左右以来,我还没有详细研究过 Android 字节码,但当时根本不支持 invokedynamic*。此外,Android 有许多验证者——首先是 Dalvik,但后来太慢了,所以他们转向了 ART。它们应该表现相似,但当然,每个都是独立的代码库,有自己的错误分类。(顺便说一句,在 JVM 方面也有两个验证器,旧的基于推理的验证器和新的堆栈映射验证器,它们有自己的错误,尽管由于没有像 Android 那样快速发展,通常没有那么多的错误)。

无论如何,看起来 ART 验证器源代码在这里

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

于 2021-01-01T15:54:21.803 回答