**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在这点上是明确的。因此如果要做反编译,数组类型信息必须还原。
- 前言
- Android 热补丁技术——资源的热修复
- 插件化系列详解
- Dex分包——MultiDex
- Google官网——配置方法数超过 64K 的应用
- IMOOC热修复与插件化笔记
- 第1章 class文件与dex文件解析
- Class文件解析
- dex文件解析
- class与dex对比
- 第2章 虚拟机深入讲解
- 第3章 ClassLoader原理讲解
- 类的加载过程
- ClassLoade源码分析
- Android中的动态加载
- 第4章 热修复简单讲解
- 第5章 热修复AndFix详解
- 第6章 热修复Tinker详解及两种方式接入
- 第7章 引入热修复后代码及版本管理
- 第8章 插件化原理深入讲解
- 第9章 使用Small完成插件化
- 第10章 使用Atlas完成插件化
- 第11章 课程整体总结
- DN学院热修复插件化笔录
- 插件化
- 热修复
- Android APP开发应掌握的底层知识
- 概述
- Binder
- AIDL
- AMS
- Activity的启动和通信原理
- App启动流程第2篇
- App内部的页面跳转
- Context家族史
- Service
- BroadcastReceiver
- ContentProvider
- PMS及App安装过程