Dalvik过程虚拟机

Dalvik是一个进程虚拟机(process virtual machine),由Google等厂商合作开发的Android移动设备平台的核心组成部分之一。

由Java编写的程序代码被编译成可以在JVM上执行的ByteCode,然后再被转码成dalvik字节码,然后存储到 .dex (Dalvik EXecutable)和.odex (Optimized Dalvik EXecutable)的文件里,成为适合运行于内存和处理器速度有限的系统下面。

Dalvik是一个开源软件,由Dan Bornstein编写的,名字来源于他的祖先曾经居住过的小渔村达尔维克(Dalvík),位于冰岛Eyjafjörður。

另外还有一个叫做Android Runtime (ART)的运行环境,在Android 4.4 "KitKat"被叫做技术预览版(technology preview)与Dalvik共存, 而到了Android L的开发预览版(development preview releases),ART把Dalvik整个替换掉了。

1. 架构

大多数虚拟机包括JVM都是一种堆栈机器,而Dalvik虚拟机则是寄存器机。两种架构各有优劣,一般而言,基于堆栈的机器需要更多指令,而基于寄存器的机器指令更长。

dx工具是一种用来转换Java class成为DEX格式的工具。多个类被包含在一个dex文件之中。各个类中重复的字符串和其他常数只在 DEX 中存放一次,以节省空间。Java字节码(bytecode)被转换成Dalvik虚拟机所使用的替代指令集。一个未压缩dex文件通常稍小于一个已经压缩的.jar文件。

安装到行动设备之时,Dalvik可执行文件可能会被修改。为了获得进一步优化,虚拟机可能会调整文件内部分数据的端序、内联一些函数和简单的结构体、并短路掉一些不必要的操作。

当Android启动时,Dalvik VM 监视所有的程序(APK),并且创建依存关系树,为每个程序优化代码并存储在Dalvik缓存中。Dalvik第一次加载后会生成Cache文件,以提供下次快速加载,所以第一次会很慢。

Dalvik解释器采用预先算好的Goto地址,每个指令对内存的访问都在64字节边界上对齐。这样可以节省一个指令后进行查表的时间。为了强化功能, Dalvik还提供了快速翻译器(Fast Interpreter)。

1.1. dx

dx 是一套工具,可以将 Java .class 转换成 .dex 格式. 一个dex文件通常会有多个.class。由于dex有时必须进行优化,会使文件大小增加1-4倍,以ODEX结尾。

2. 性能

3. 授权和专利

4. A comparison of Dalvik and ART architectures

它与Android Runtime的主要不同,在于Dalvik采用即时编译(JIT),而ART采用Ahead-of-time(AOT)技术。

Compare_Of_ART_And_Dalvik.png

5. Reference


CategoryAndroid

MainWiki: Dalvik (last edited 2011-04-21 00:56:37 by twotwo)