【发布时间】:2014-05-05 18:32:29
【问题描述】:
在 DVM 源代码中,您可以看到 methodIdx 在很多函数中用作方法 ID。该属性不在方法类中,我没有找到关于它的好的描述。
所以我的问题是,是一个绝对标识符,它对于一个进程来说总是一样的,可以改变,什么时候可以改变等等......以及如何或在哪里生成。
谢谢
【问题讨论】:
在 DVM 源代码中,您可以看到 methodIdx 在很多函数中用作方法 ID。该属性不在方法类中,我没有找到关于它的好的描述。
所以我的问题是,是一个绝对标识符,它对于一个进程来说总是一样的,可以改变,什么时候可以改变等等......以及如何或在哪里生成。
谢谢
【问题讨论】:
methodIdx一般是“方法引用索引”。
它是method_ids 表的索引,在file format 文档中进行了描述。该索引是相对于单个 DEX 文件的,这就是为什么像 dvmResolveMethod() 这样的函数采用引用类以及方法引用索引的原因。 Dalvik bytecode 文档中的invoke-kind 解释中提到了它。
每个method_id_item 通过定义它的类和函数的原型(名称、参数、返回类型)来标识一个方法。在 DEX 文件中声明或引用的每个方法都有一个 method_id_item。索引是由dx生成DEX文件时建立的。
所以...methodIdx 将您带到包含一堆字符串的表条目。从那里,符号查找将您带到实际的方法实现,即Method*。详情请参阅dalvik/vm/oo/Resolve.cpp 中的dvmResolveMethod()。
因为invoke 指令只有16 位方法引用索引的空间,所以在单个DEX 文件中不能引用超过65535 个方法。 (这是一个well known 问题。)
【讨论】: