一什么是 Dalvik 虚拟机
Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机, 它是 Android 平台的重要组成部分, 支持 dex 格式 (Dalvik Executable) 的 Java 应用程序的运行 dex 格式是专门为 Dalvik 设计的一种压缩格式, 适合内存和处理器速度有限的系统 Google 对其进行了特定的优化, 使得 Dalvik 具有高效简洁节省资源的特点从 Android 系统架构图知, Dalvik 虚拟机运行在 Android 的运行时库层
Dalvik 作为面向 Linux 为嵌入式操作系统设计的虚拟机, 主要负责完成对象生命周期管理堆栈管理线程管理安全和异常管理, 以及垃圾回收等另外, Dalvik 早期并没有 JIT 编译器, 直到 Android2.2 才加入了对 JIT 的技术支持
二 Dalvik 虚拟机的特点
体积小, 占用内存空间小;
专有的 DEX 可执行文件格式, 体积更小, 执行速度更快;
常量池采用 32 位索引值, 寻址类方法名, 字段名, 常量更快;
基于寄存器架构, 并拥有一套完整的指令系统;
提供了对象生命周期管理, 堆栈管理, 线程管理, 安全和异常管理以及垃圾回收等重要功能;
所有的 Android 程序都运行在 Android 系统进程里, 每个进程对应着一个 Dalvik 虚拟机实例
三 Dalvik 虚拟机和 Java 虚拟机的区别
Dalvik 虚拟机与传统的 Java 虚拟机有着许多不同点, 两者并不兼容, 它们显著的不同点主要表现在以下几个方面:
Java 虚拟机运行的是 Java 字节码, Dalvik 虚拟机运行的是 Dalvik 字节码
传统的 Java 程序经过编译, 生成 Java 字节码保存在 class 文件中, Java 虚拟机通过解码 class 文件中的内容来运行程序而 Dalvik 虚拟机运行的是 Dalvik 字节码, 所有的 Dalvik 字节码由 Java 字节码转换而来, 并被打包到一个 DEX(Dalvik Executable)可执行文件中 Dalvik 虚拟机通过解释 DEX 文件来执行这些字节码
Dalvik 可执行文件体积小 Android SDK 中有一个叫 dx 的工具负责将 Java 字节码转换为 Dalvik 字节码
dx 工具对 Java 类文件重新排列, 消除在类文件中出现的所有冗余信息, 避免虚拟机在初始化时出现反复的文件加载与解析过程一般情况下, Java 类文件中包含多个不同的方法签名, 如果其他的类文件引用该类文件中的方法, 方法签名也会被复制到其类文件中, 也就是说, 多个不同的类会同时包含相同的方法签名, 同样地, 大量的字符串常量在多个类文件中也被重复使用这些冗余信息会直接增加文件的体积, 同时也会严重影响虚拟机解析文件的效率消除其中的冗余信息, 重新组合形成一个常量池, 所有的类文件共享同一个常量池由于 dx 工具对常量池的压缩, 使得相同的字符串, 常量在 DEX 文件中只出现一次, 从而减小了文件的体积
针对每个 Class 文件, 都由如下格式进行组成:
dex 格式文件使用共享的特定类型的常量池机制来节省内存常量池存储类中的所有字面常量, 它包括字符串常量字段常量等值
简单来讲, dex 格式文件就是将多个 class 文件中公有的部分统一存放, 去除冗余信息
**Java 虚拟机与 Dalvik 虚拟机架构不同 ** 这也是 Dalvik 与 JVM 之间最大的区别
Java 虚拟机基于栈架构, 程序在运行时虚拟机需要频繁的从栈上读取或写入数据, 这个过程需要更多的指令分派与内存访问次数, 会耗费不少 CPU 时间, 对于像手机设备资源有限的设备来说, 这是相当大的一笔开销 Dalvik 虚拟机基于寄存器架构数据的访问通过寄存器间直接传递, 这样的访问方式比基于栈方式要快很多
四 Dalvik 虚拟机的结构
一个应用首先经过 DX 工具将 class 文件转换成 Dalvik 虚拟机可以执行的 dex 文件, 然后由类加载器加载原生类和 Java 类, 接着由解释器根据指令集对 Dalvik 字节码进行解释执行最后, 根据 dvm_arch 参数选择编译的目标机体系结构
五 Android APK 编译打包流程
来源: http://www.bubuko.com/infodetail-2503110.html