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

ajm*_*jma 41 android dalvik dex-limit art-runtime

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

fad*_*den 73

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

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

B: method reference index (16 bits)
Run Code Online (Sandbox Code Playgroud)

您可以在DEX文件中引用大量方法,但是您只能调用第一个65536,因为这是方法调用指令中的所有空间.

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

解决此问题的一种方法是添加其他指令,以获取更广泛的方法引用.在Android 4.0(ICS)中实现并发布了一种名为"jumbo opcodes"的方法,但该方法从未完全投入使用,后来从树中删除.(我偶尔会看到这里的帖子,其中包含来自"dx"的错误消息,这些消息引用了jumbo ops,或者是偶然发现它们的开发人员.)

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

我的理解是,ART的当前实现处理了Dalvik所做的相同指令集,因此情况也不例外.

  • 我遇到了相同的`dexdeps`工具并编写了一个更完整的`dex-method-counts`工具,它使用它来输出(每个包/类)方法计数:https://github.com/mihaip/dex-method -COUNTS (5认同)
  • 我的意思是在单独的DEX文件中定义的方法.对于大多数应用程序,这只是框架和核心库/使用库的东西.FWIW,这就是为什么用多索解决方案将你的DEX文件分成两部分(http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html)不会离开你有两个DEX文件,每个文件只有一半的方法引用. (2认同)
  • @fadden你说限制不在于定义的方法数量,但是如果你采用一个空的Android项目并添加一个包含65536个空方法的类而不调用其中任何一个,你仍然会得到异常.我错过了什么或者你说错了吗? (2认同)
  • @cdroid本地定义的方法是隐式引用的,无论它们是否在本地调用.我试图说明在单个DEX中定义超过64K的方法并不是唯一的失败途径.表中可能有一些"死角".(模糊相关:有一次我试图通过"垃圾收集"索引来减少VM的并行解析实体表的内存占用,但结果不够好,不值得额外的复杂性.请参阅https中的大量注释://android.googlesource.com/platform/dalvik/+/froyo/vm/analysis/ReduceConstants.c.) (2认同)

Ale*_*pov 5

Anwar Ghuloum在这个 Android Developers Backstage剧集中告诉他们,他们不会在不久的将来修复字节码.
相反,从Android L开始,他们将通过将所有dex文件(从APK)折叠到单个燕麦文件中来原生支持multi-dex.