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所做的相同指令集,因此情况也不例外.
归档时间: |
|
查看次数: |
9507 次 |
最近记录: |