咨询Dex文件method_handles与call_site_ids段的偏移量及大小
我之前研究DEX文件格式的时候也碰到过一模一样的困惑,这俩段的定位逻辑确实和string_ids、type_ids这些常规段不一样,咱们一步步理清楚:
首先,注意DEX版本要求:call_site_ids和method_handles是Android 8.0(API 26)对应的DEX格式版本(037及以上)才新增的段,用来支持
invokedynamic相关的动态调用特性。如果你看的是旧版本的DEX文档或者解析的是低版本DEX文件,自然找不到这两个段的头部字段。它们通过链接段(Link Section)定位:和string_ids这类直接在DEX头部(
header)里存offset和size字段的段不同,这两个段的位置信息藏在链接段里。DEX头部有个link_off字段,指向链接段的起始偏移,链接段内部会包含多个类型的条目,其中就有专门对应CALL_SITES和METHOD_HANDLES的条目,每个条目会记录对应段的起始偏移(相对于DEX文件开头)和总长度。索引引用的逻辑对应:你提到的用索引引用
call_site_item和method_handle_item的场景,正是因为这些索引是基于链接段定位到的段来计算的——索引0对应段内第一个item,以此类推,而段的起始位置和每个item的固定长度结合,就能算出具体item的偏移。
举个实操例子:用dexdump工具解析一个包含invokedynamic的DEX文件,你会在输出里看到Link Section部分,里面会明确列出CALL_SITES和METHOD_HANDLES的偏移、大小信息,接着就能找到对应的段内容。
内容的提问来源于stack exchange,提问作者letmutx

