android - Android ART 运行时是否具有与 Dalvik 相同的方法限制限制?

标签 android dalvik art-runtime dex-limit

Android ART 运行时是否具有与 Dalvik 相同的方法限制限制? 目前,主 dex 文件中有 64k 个方法的限制

最佳答案

问题不在于 Dalvik 运行时或 DEX 文件格式,而在于当前的 Dalvik instructions 集.具体来说,各种方法调用方法,如下所示:

invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB

B: method reference index (16 bits)

你可以在一个 DEX 文件中引用非常多的方法,但你只能调用前 65536 个,因为这就是你在方法调用指令中的全部空间。

我想指出,限制是引用方法的数量,而不是定义方法的数量。如果您的 DEX 文件只有几个方法,但它们一起调用了 70,000 个不同的外部定义方法,那么您将超出限制。

解决此问题的一种方法是添加采用更广泛方法引用的附加指令。一种称为“巨型操作码”的方法在 Android 4.0 (ICS) 中实现并发布,但从未完全付诸实现,后来 removed from the tree . (我偶尔会在这里看到来自“dx”的错误消息,这些帖子引用了巨型操作,或者来自 stumbled over them 的开发人员。)

注意这不是 Facebook hack 解决的问题.这是由于用于保存类/方法/字段元数据的固定大小的缓冲区。那里没有特定于方法的限制;您可以通过拥有大量字段来炸毁缓冲区。

我的理解是,ART 的当前实现处理的指令集与 Dalvik 相同,所以情况不会有什么不同。

关于android - Android ART 运行时是否具有与 Dalvik 相同的方法限制限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21490382/

相关文章:

java - 更改日期和时间格式 Android

Android getApplicationContext内存管理

android - 如何将 Scala 集成到核心 Android 平台中?

android - 试图了解 Dalvikvm 和内存泄漏

android - java.lang.StackOverflow Error for Android L预览跑图

Java/Android : convert String to bytes[] then to float and back

android - 我如何使用注释处理器检查整个源代码树?

android - Android ART 是否像 Dalvik 一样支持运行时动态类加载?

android - list 合并失败 : Android Studio