【发布时间】:2014-02-24 18:09:16
【问题描述】:
Android ART 运行时是否具有与 Dalvik 相同的方法限制限制? 目前,主 dex 文件中有 64k 个方法的限制
【问题讨论】:
标签: android dalvik art-runtime dex-limit
Android ART 运行时是否具有与 Dalvik 相同的方法限制限制? 目前,主 dex 文件中有 64k 个方法的限制
【问题讨论】:
标签: android dalvik art-runtime dex-limit
问题不在于 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 相同,所以情况不会有什么不同。
【讨论】:
dexdeps 工具并编写了一个更完整的dex-method-counts 工具,使用它来输出(每个包/类)方法计数:github.com/mihaip/dex-method-counts
Anwar Ghuloum 在thisAndroid 开发者后台一集中告诉他们,他们不会在不久的将来修复字节码。
相反,从 Android L 开始,它们将通过将所有 dex 文件(来自 APK)折叠成单个 oat 文件来原生支持多 dex。
【讨论】: