sun博客

记录点滴!

struct DexFile{
DexHeader header;
DexStringId StringIds[StringIdSize];
DexTypeId  TypeIds[typeIdsSize];//类型,V,I,Llang/Object/String等
DexProtoId ProtoIds[protoIdsSize];//方法的原型。参数申明,返回值类型,签名信息
DexFieldId FieldIds[fieldIdsSize];
DexMethodId MethodIds[methodIdsSize];
DexClassDef ClassDefs[classDefsSize];
DexData Data[];
DexLink LinkData;
}

dex将代码中的字符串,字段名,类名,方法名,常量名,变量名全部提取出来放到Data区。通过StringId存放偏移位置。TypeId,protoId,filedId,MethodId,classId获取均需要从Data区域以偏移量获得。从而减少了包的体积。

指令如何查看?

instruction-formats.html和dalvik-bytecode.html中有。举例来说,

A|G|op BBBB F|E|D|C 由三部分组成,空格分隔,每部分16位。op这个占8位,不同字符用|分隔。A与G相对应。FEDC分别代表参数。注意看参数列表。

指令格式中,”king@”总共有6种类型,分别为:

meth:

field:

type:

string:

vtaboff:

fieldoff:

有的时候,在指令格式中不会明确说明”king@”是meth或field等,而是只是隐式的说为”kind@”,在这种情况下不影响指令确定”kind@“类型,因为每种指令已经约定好了”kind@”是什么类型,比如说opCode 0x70对应的”kind@”为方法类型(meth)

详细指令说明看这文章即懂:

https://www.codenong.com/cs106206083/

指令html文件在这里找。android 4.0,dalvik/docs目录下

http://androidxref.com/

发表评论

邮箱地址不会被公开。 必填项已用*标注