0

丹伯恩斯坦 说

字节码指令集无法引用需要超过 16 位的方法号。

...这对于任何使用辅助 dex 加载放屁的人来说有点令人担忧,因为他们正在开发一个庞大的、庞大的应用程序,该应用程序达到了每个文件 64K 方法的限制。听起来,是的,你可以拥有一个包含数十万个方法的应用程序,但是这样做你已经建立了一个定时炸弹:迟早,一些持久用户将使用足够的代码路径,让 Dalvik 加载足够的类方法计数超过 65,536,您的应用程序将崩溃。

我们正面临这个问题,有人问我是否有办法找出实际加载了多少方法。我在 JavaDoc 中四处寻找并进行了一些谷歌搜索,结果一片空白。因此我的问题是:

有没有办法在运行时找出实际加载了多少方法?(无需重新编译 Dalvik 以公开此信息!)

4

1 回答 1

2

64K 方法限制与运行时 VM 中存在多少方法无关。它是关于在单个 DEX 文件中引用了多少方法。在“dx”转换过程中,由于方法数量过多而导致的任何失败都会发生。

(如果您查看方法调用指令的字节码格式,您会发现它们包含目标方法的 16 位索引。该索引指向每个 DEX 文件表,而不是 VM 全局表。 )

唯一相关的运行时限制是存储类、字段和方法的元数据(vtable 等)所需的内存量。这就是Facebook为了让他们非常大的应用程序在旧版本的 Android 上运行而进行的黑客攻击。

于 2013-11-14T20:21:59.370 回答