Android ART运行时是否像Dalvik一样存在方法数量限制呢? 目前,主dex文件中有64k个方法的限制。
Android ART运行时是否像Dalvik一样存在方法数量限制呢? 目前,主dex文件中有64k个方法的限制。
invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB
B: method reference index (16 bits)
您可以在DEX文件中引用大量方法,但只能调用前65536个,因为这是方法调用指令中可用的空间。
我想指出的是,限制是在所引用的方法数量上,而不是在定义的方法数量上。如果您的DEX文件只有几个方法,但它们一起调用了70,000个不同的外部定义方法,那么您将超过限制。
修复此问题的一种方法是添加额外的指令以采用更广泛的方法引用。一种称为“jumbo opcodes”的方法已在Android 4.0(ICS)中实现和发布,但从未完全付诸实践,并且后来被从树中删除。(我偶尔会在这里看到帖子,其中包含引用jumbo ops的“dx”错误消息,或者开发人员意外地遇到它们。)
请注意,这不是由Facebook hack解决的问题。这是由于用于存储类/方法/字段元数据的固定大小缓冲区引起的。那里没有特定于方法的限制;您可以通过有很多字段来使缓冲区溢出。在这个Android开发者后台的第11集中,Anwar Ghuloum表示他们不会在不久的将来修复字节码问题。
相反,从Android L开始,他们将通过将所有dex文件(来自APK)折叠成单个oat文件来本地支持多dex。
dexdeps
工具,并编写了一个更完整的dex-method-counts
工具,它使用它来输出(按包/类)方法计数:https://github.com/mihaip/dex-method-counts - Mihai Parparita