如何解决android验证器源代码在哪里?
在哪里可以找到android代码验证器的源代码?我想使用 invokedynamic
,但从 android 验证程序中得到一些验证错误 (java.lang.VerifyError: Verifier rejected class ...
)。我的代码可以完美地使用普通的 JVM,没有验证问题,但 android 验证程序拒绝它,我想分析它为什么会这样做。我似乎无法在网上找到验证器源代码,但如果它在我的设备上运行,它必须在某个地方。
解决方法
首先,JVM 和 Android 使用完全不同的字节码格式(分别是类文件和 Dex)。虽然它们很相似,但它们都有不同的操作码和编码方法,以及不同的功能和边缘情况。有一些工具可以将一种翻译成另一种,但鉴于存在差异,您无法始终准确地翻译所有内容。
我从 2016 年左右开始就没有详细研究过 Android 字节码,但当时根本不支持调用动态*。此外,Android 有很多验证器——首先是 Dalvik,但后来太慢了,所以他们转向了 ART。它们应该行为相似,但当然,每个都是独立的代码库,有自己的各种错误。 (顺便说一下,在 JVM 端还有 两个验证器,旧的基于推理的验证器和新的堆栈映射验证器,它们也 有自己的错误,尽管通常没有那么多,因为没有 Android 发展得那么快)。
无论如何,看起来 ART 验证器源代码是 here。
*编辑:看起来 Android 已经添加了 invoke-custom
操作码,它的 invokedynamic
等效项。与 Dex 的所有事物一样,两者之间也存在细微差别。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。