android热修复和android插件化开发,class与dex对比

**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在这点上是明确的。因此如果要做反编译,数组类型信息必须还原。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值