记得你在一篇文章中写到
------------------------------------------------------
Dalvik OpCodes的大小与内容由最后insnsSize与insns决定,0x2e8指向的数据解析为:
registersSize 1
insSize 0
outsSize 1
triesSize 0
debugInfoOff 0x642
insnsSize 4
Insns 7010 0000 0000 0E00
到“/dalvik/docs/dalvik-bytecode.html”文件中翻看OpCodes,得到70为invoke-direct,格式为:
invoke-direct {vC, vD, vE, vF, vG}, meth@BBBB
A: argument word count (4 bits)
B: method reference index (16 bits)
C..G: argument registers (4 bits each)
指令格式编号为35c,到“/dalvik/docs/instruction-formats.html”文件中查看35c的编码参数说明:
A|G|op BBBB F|E|D|C
[A=5] op {vC, vD, vE, vF, vG}, meth@BBBB
[A=5] op {vC, vD, vE, vF, vG}, type@BBBB
[A=4] op {vC, vD, vE, vF}, kind@BBBB
[A=3] op {vC, vD, vE}, kind@BBBB
[A=2] op {vC, vD}, kind@BBBB
[A=1] op {vC}, kind@BBBB
[A=0] op {}, kind@BBBB
7010 0000 0000表示,70为invoke-direct,A=1使用“[A=1] op {vC}, kind@BBBB”,G=0表示使用v0,BBBB=0000表示MethodId索引为0,F|E|D|C=0,在DexHeader中DexMethodId 结构定义如下:
struct DexMethodId {
u2 classIdx; /* index into typeIds list for defining class */
u2 protoIdx; /* index into protoIds for method prototype */
u4 nameIdx; /* index into stringIds for method name */
};
第一个字段指向typeId的索引,DexTypeId 结构如下:
struct DexTypeId {
u4 descriptorIdx; /* index into stringIds list for type descriptor */
};
第二个字段指向protoId的索引,DexProtoId 结构如下:
struct DexProtoId {
u4 shortyIdx; /* index into stringIds for shorty descriptor */
u4 returnTypeIdx; /* index into typeIds list for return type */
u4 parametersOff; /* file offset to type_list for parameter types */
};
descriptorIdx与shortyIdx都指向了一个DexStringId ,也就是DexHeader中stringIdsOff相应的字符串位置,它的结构如下:
struct DexStringId {
u4 stringDataOff; /* file offset to string_data_item */
};
回到刚才的分析,上面代码的Method的methodIdx为0,在DexHeader中methodIdsOff指向0x190,取得classIdx为1,在DexTypeId中取得descriptorIdx为1,得到最终字符串“android/app/Activity”,取得protoIdx为1,在DexProtoId 取得shortyIdx为0x11,取得最终字符串为“V”,取得nameIdx为0,取得最终字符串为“<init>”。
0E00查得OpCodes代表:return-void
综合上面的分析,得出最终的代码为:
invoke-direct {v0}, Landroid/app/Activity;.<init>:()V // method@0000
return-void
-----------------------------------------------------------
这一段,看不懂啊,你是如何知道A=1的?