【问题标题】:DVM : methodIdxDVM:方法Idx
【发布时间】:2014-05-05 18:32:29
【问题描述】:

在 DVM 源代码中,您可以看到 methodIdx 在很多函数中用作方法 ID。该属性不在方法类中,我没有找到关于它的好的描述。

所以我的问题是,是一个绝对标识符,它对于一个进程来说总是一样的,可以改变,什么时候可以改变等等......以及如何或在哪里生成。

谢谢

【问题讨论】:

    标签: android dalvik


    【解决方案1】:

    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 问题。)

    【讨论】:

    • 谢谢!不错的答案。我可以假设总是使用相同的 DEX,每个函数都有相同的 methodIdx,不是吗?因此,例如,我可以使用该号码来识别给定 dex 文件中的调用。
    • 对 { DEX 文件,methodIdx } 解析为单个特定方法。单个方法不应有多个 method_ids 表条目(因为这会浪费空间),因此不应有两个不同的 methodIdx 值在单个 DEX 中解析为相同的方法。但是请注意,从不同 DEX 文件引用的相同方法在该 DEX 文件的上下文中可能具有不同的 methodIdx。如果你的 DEX 文件更新了,那么一切都会改变。
    • 所以不能作为标识符使用。感谢您的详细解释。
    • 它可以用作正在运行的 VM 进程中的标识符的一部分,或者用于一组静态的 DEX 文件,只要您将它与定义该方法的 DEX 文件的引用配对即可。但不,数字本身并不是全球唯一标识符。
    猜你喜欢
    • 2019-08-03
    • 2022-07-01
    • 1970-01-01
    • 2021-05-24
    • 2018-04-05
    • 2022-01-23
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多