我想知道为了Dex方法计数限制,本地C++编写的方法是否计入Dex文件方法计数中。本机C++方法是以dex文件方法计数吗?
如果是,如果添加1个本地方法,将多少种方法添加到Dex计数中?
有多少方法确实一个Java方法添加到DEX计数,因为我似乎并没有在每次构建我做了坚实的数...
我想知道为了Dex方法计数限制,本地C++编写的方法是否计入Dex文件方法计数中。本机C++方法是以dex文件方法计数吗?
如果是,如果添加1个本地方法,将多少种方法添加到Dex计数中?
有多少方法确实一个Java方法添加到DEX计数,因为我似乎并没有在每次构建我做了坚实的数...
要得到我们应通过.Dex Format走路的答案。在我们的案例中,最有趣的部分是method_ids
阵列:
方法标识符列表。这些是由该文件引用的所有方法的标识符,不管是否在文件中定义。此 列表必须排序,其中定义类型(按
type_id
索引)是 主要订单,方法名称(按string_id
索引)是中间订单 ,而方法原型(按proto_id
索引)是次要订单。 该列表不能包含任何重复的条目。
不管到的阵列记录数被存储为32位无符号整数的事实(参见method_ids_size
字段)在实践中,这阵列不能含有多于65536
条目。这是因为invoke-xxxx
指令的method_id
操作数是一个16位实体,必须是method_ids
的有效索引。由于索引大于65535
的结果记录将无法通过字节码访问。所有这些导致了众所周知的“64K方法”问题。
因此,正如文档所述 - method_ids
对于由dex
定义的每种方法以及外部定义的方法定义的每种方法都有一条记录,这些定义的方法由代码引用。
因此,每次添加如下代码:
public native void foo();
你的类之一 - 你在method_ids
一个额外的记录。对于abstract
方法的声明也是如此。然后,每次你添加一些实施定期的方法,如:
public void baz() {
/* ... */
}
你得到baz()
本身和记录一个新纪录由baz()
引用和未添加到method_ids
但所有的方法。
本机代码根本不会影响dex
内容,因为所有C/C++源代码都被编译为机器代码,并通过.so
文件分发。这些使用ELF格式,这有其自身的局限性,并且完全独立于DEX。