是在DEX文件方法计数中计数的本机C 方法

Are native C++ methods counted in dex file method count?

本文关键字:方法 本机 是在 DEX 文件      更新时间:2023-10-16

我想知道为了dex方法计数限制,在dex文件方法中计数本机中写入的方法是否计数。

如果是,如果添加了1种本机方法,则将多少方法添加到DEX计数中?

java方法添加了多少方法,因为我似乎没有一个可靠的数字...

要获得答案,我们应该浏览.dex格式。在我们的情况下,最有趣的部分是method_ids数组:

方法标识符列表。这些是所有方法的标识符 该文件提到的,无论是否在文件中定义。这 必须对列表进行排序,其中定义类型(由type_id索引)为 主要顺序,方法名称(由string_id索引)是中间人 顺序和方法原型(通过proto_id索引)是次要顺序。 该列表不得包含任何重复的条目。

不管阵列记录的数量存储为32位无符号整数(请参见method_ids_size字段),在实践中,此数组不能包含的不超过65536条目。这是因为invoke-xxxx DEX指令的method_id操作数是16位实体,必须是method_ids的有效索引。结果记录具有更大的索引,即65535将无法通过字节码无法访问。所有这些都导致了众所周知的" 64K方法"问题。

so,正如文档所说 - method_ids的每种dex和外部定义的方法都有一个记录。

因此,每次添加代码如下:

public native void foo();

在您的一个课程中 - 您在method_ids中获得了一个额外的记录。abstract方法的声明也是如此。然后,每次添加某些常规方法的实现,例如:

public void baz() {
    /* ... */
}

您将获得baz()本身的新记录,并记录baz()引用的所有方法,尚未添加到method_ids中。

本机代码对dex内容没有影响,因为所有C/C 源都汇编为通过.so文件分发的机器代码。这些使用具有自身限制的精灵格式,并且绝对独立于Dex。