.class 是 java 虚拟机使用的可执行文件,.dex 是在 Android Dalvik的可执行文件。
Art 虚拟机的可执行文件是.oat。以后有看再做。
两个文件的解析分别放在了两个 github 仓库,自己写的小程序,完成度80%还是有的。关键信息的解析都能包括
关于 Dalvik 虚拟机推荐<Android Dalvik 虚拟机结构及机制剖析 卷 1、卷 2>(清华大学出版社)
https://github.com/Wi1ls/ClassParse
https://github.com/Wi1ls/DexParse
言外:
.dex 的操作码是基于寄存器的,因此其 code 信息与 .class 的字节码不同。在 demo 中,解析sayHelloInTest1@Test1后的log 有
registers_size(寄存器个数)=8, ins_size(入参空间)=4, outs_size(内部函数调用空间)=0, tries_size(try 语句块数量)=0, debug_info_off=638, insns_size(指令数组)=7, insns(指令)=[-28160, 1285, -25342, 1542, -32512, -17632, 4096],
codeBinary=[0x9200, 0x0505, 0x9d02, 0x0606, 0x8100, 0xbb20, 0x1000], padding(try 语句块对齐)=0, tries,handler先不解析}],
现在来看原始的 codeBinary,方法对应的原始 code 信息
0x9200,0505,9d02,0606,8100,bb20,1000
当解析0x9200时,Android 平台使用小端存储,因此正确翻译后为0x0092,根据官方提供的可执行指令说明,在这里操作码为0x92,查看手册
![](https://img.haomeiwen.com/i3012162/a13d5450d7870d12.png)
且0x92的 id 为23x,继续查表
![](https://img.haomeiwen.com/i3012162/91a3e6a4a407ade8.png)
于是0x92 的完整指令是0x9200,0505,翻译为
0x9200,0505 mult-int v00,v05,v05
同理0x9d 的完整指令为0x9d02,0606,翻译为
0x9d02,0606 mul-long v02,v06,v06
同理 0x81 完整指令为0x8100,翻译为
0x8100 int-to-long v0,v0
同理0xbb 完整指令为0xbb20,翻译为
0xbb20 mul-int/2addr v0,v2
同理0x10完整指令为0x1000,翻译为
0x1000 return-wide v00
完整翻译:
0x9200 0505 mult-int v00,v05,v05
0x9d06 0606 mul-long v02,v06,v06
0x8100 int-to-long v0,v0
0xbb20 mul-int/2addr v0,v2
0x1000 return-wide v00
验证,用 sdk 自定的 dexdump -d 指令
![](https://img.haomeiwen.com/i3012162/00ac8f860e045710.png)
说明自己写的 dex-parse 工具的正确性
网友评论