在刚学习Java的时候我们都会写一个HelloWorld的示例。

1
2
3
4
5
public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello,world!");
    }
}

然后通过javac命令编译成字节码,然后调用java命令机执行字节码。我们如何像java一样在命令行里直接在命令行输出Hello,world!呢。具体要执行如下操作:

.class文件转换成.dex文件

1
dx --dex --output=HelloWorld.dex HelloWorld.class

dex文件推送到sd卡上。

1
adb push HelloWorld.dex /sdcard/

执行字节码

1
2
adb shell
dalvikvm -cp /sdcard/HelloWorld.dex HelloWorld

Dex文件包括如下结构

img

头部信息

查看刚才生成的dex的十六进制

image-20190927104628357

Header的大小固定为0x70,偏移地址从0x000x70

Header包含的字段和各个字段的长度如下表所示:

address Name size/byte Value
0 Magic Number 8

string_ids数据结构

type_ids数据结构

proto_ids数据结构

field_ids数据结构

method_ids数据结构

class_defs数据结构

参考