在DVM源代码中,您可以看到在许多函数中用作方法ID的methodIdx。这个属性不在Method Class中,我没有找到关于它的好描述。
所以我的问题是,是一个绝对的标识符,它对于一个过程来说总是一样的,可以改变,什么时候可以改变等等......以及如何或在哪里生成。
由于
答案 0 :(得分:4)
methodIdx
通常是"方法参考索引"。
它是method_ids
表中描述的dvmResolveMethod()
表的索引。索引相对于单个DEX文件,这就是invoke-kind
之类的函数接受引用类以及方法引用索引的原因。在Dalvik file format文档的method_id_item
解释中提到了这一点。
每个method_id_item
通过定义它的类以及函数的原型(名称,参数,返回类型)来标识方法。 DEX文件中声明或引用的每个方法都有一个dx
。 DEX文件由methodIdx
生成时建立索引。
所以... Method*
会让你进入一个带有一串字符串的表条目。从那里开始,符号查找将引导您进入实际的方法实现,即dvmResolveMethod()
。有关详细信息,请参阅bytecode中的invoke
。
由于{{1}}指令只有16位方法引用索引的空间,因此您无法在单个DEX文件中引用超过65535种方法。 (这是一个dalvik/vm/oo/Resolve.cpp问题。)