Android ART 运行时是否具有与 Dalvik 相同的方法限制限制?目前,主 dex 文件中的方法限制为 64k
2 回答
问题不在于 Dalvik 运行时或 DEX 文件格式,而在于当前的Dalvik 指令集。具体来说,各种方法调用方法,如下所示:
invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB
B: method reference index (16 bits)
你可以在一个 DEX 文件中引用非常多的方法,但你只能调用前 65536 个,因为这就是你在方法调用指令中的全部空间。
我想指出,限制在于引用的方法数量,而不是定义的方法数量。如果您的 DEX 文件只有几个方法,但它们一起调用了 70,000 个不同的外部定义方法,那么您将超出限制。
解决此问题的一种方法是添加采用更广泛方法引用的附加指令。一种称为“巨型操作码”的方法在 Android 4.0 (ICS) 中实现并发布,但从未完全付诸实施,后来从树中删除。(我偶尔会在这里看到来自“dx”的错误消息,这些帖子引用了巨型操作,或者来自偶然发现它们的开发人员。)
请注意,这不是Facebook hack解决的问题。这是由于用于保存类/方法/字段元数据的固定大小的缓冲区。那里没有特定于方法的限制;您可以通过拥有大量字段来炸毁缓冲区。
我的理解是,ART 的当前实现处理与 Dalvik 相同的一组指令,因此情况不会有什么不同。
Anwar Ghuloum 在Android Developers Backstage 的这一集中告诉他们,他们不会在不久的将来修复字节码。
相反,从 Android L 开始,它们将通过将所有 dex 文件(来自 APK)折叠到单个 oat 文件中来原生支持多 dex。