ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**class文件格式与dex文件格式的异同** - 本质上他们都是一样的,dex是从class文件演变而来的 - class文件存在许多冗余信息,dex会去除冗余,并整合 **Dalvik 虚拟机字节码和JVM 字节码的区别**: **一、程序结构不同** JVM字节码由“.class”文件组成, 每个文件一个class。JVM在运行的时候为每一个类装载字节码。相反的,Dalvik 程序只包含一个“.dex”文件, 这个文件包含了程序中所有的类。如图1所示为生成.dex 文件的过程。 :-: ![](https://box.kancloud.cn/afe0b63fcd7559e31b7da14d75069c0b_654x312.jpg) 图1 生成.dex的过程 Java编译器创建了JVM字节码之后,**Dalvik的dx 编译器删除“.class”文件, 重新把它们编译成Dalvik字节码,然后把它们写进一个“.dex”文件中。这个过程包括翻译、重构、解释程序的基本元素(常量池、类定义、数据段)**。常量池描述了所有的常量,包括引用、方法名、数值常量等。类定义包括了访问标志、类名等基本信息。数据段中包含各种被DVM执行的函数代码以及类和 函数的相关信息(例如Dalvik 虚拟机所需要的寄存器数量、局部变量表、操作数堆找大小),还有实例变量。 **二、寄存器结构不同** **Dalvik虚拟机是基于寄存器的,但是JVM 是基于堆栈的**。JVM 字节码中,局部变量会被放入局部变量表中,继而被压入堆栈供操作码进行运算,当然JVM也可以只使用堆栈而不显式地将局部变量存入变量表中。Dalvik虚拟机字节码中,局部变量会被赋给65536个可用的寄存器中的任何一个, Dalvik虚拟机指令直接操作这些寄存器,而不是访问堆栈中的元素。 **三、指令集不同** **Dalvik虚拟机有218个操作码,而Java虚拟机有200个,并且二者本质上完全不同**。比如,Java 虚拟机有10 多个操作码用于堆栈和本地变量表的数据转移而Dalvik虚拟机完全没有。Dalvik虚拟机指令要比Java指令更长, 因为它们经常包含了寄存器的源地址和目标地址。因此**Dalvik 虚拟机需要更少的指令**。平均来讲,**Dalvik虚拟机字节码程序指令数要比Java少30%,但是程序要大35%左右**。 **四、常量池结构不同** **JVM字节码中许多. class 文件中重复常量池**,比如重复引用函数的名字。dx编译器消除了这些重复。**Dalvik 虚拟机使用了一个常量池供所有的class同时引用**。除此之外, dx 通过内联技术消除了一些常量。在实际中,整数、长整数、单精度和双精度浮点常量在这个过程中消失了。 **五、模糊不清的基本类型不同** JVM的整数赋值和单精度浮点赋值采用不同的操作码,长整数赋值和双精度赋值也不同;而Dalvik虚拟机使用相同的操作码来对整数和浮点进行赋值。 **六、空引用不同** Dalvik虚拟机字节码并没有一个特定的空类型,而是用常量0来取代。这样,反编译时,常量0的模糊不清的含义就应当被正确地区分。 **七、类型引用的不同** Java 字节码对对象引用的比较和空类型比较使用不同的操作码,而Dalvik虚拟机只用了一个操作码来进行简化。因此如果做反编译,就必须还原比较对象的类型信息。 **八、数组原始类型的存储不同** Dalvik 虚拟机使用不明确的操作码来进行数组操作(比如aget 和aget-wide),而JVM在这点上是明确的。因此如果要做反编译,数组类型信息必须还原。