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

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

这个问题不是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)中实现并发布,但从未完全实施,后来从树上移除 。 (我偶尔在这里看post,里边有来自“dx”的错误消息,引用巨无霸的作品,或者是偶然发现的开发者)。

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

我的理解是,目前ART的实施与Dalvik所执行的指令是一致的,所以情况将不会改变。

Anwar Ghuloum在这个 Android Developers Backstage插曲中表示,他们不会在不久的将来修复字节码。
相反,从Android L开始,他们将通过将所有dex文件(从APK)折叠为单个燕麦文件来本机支持multi-dex。