2016-12-04 52 views
3

我想知道为了Dex方法计数限制,本地C++编写的方法是否计入Dex文件方法计数中。本机C++方法是以dex文件方法计数吗?

如果是,如果添加1个本地方法,将多少种方法添加到Dex计数中?

有多少方法确实一个Java方法添加到DEX计数,因为我似乎并没有在每次构建我做了坚实的数...

回答

2

要得到我们应通过.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。

相关问题