Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且[1] 每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

很长时间以来,Dalvik虚拟机一直被用户指责为拖慢安卓系统运行速度不如IOS的根源。

2014年6月25日,Android L 将正式亮相于召开的谷歌I/O大会,Android L 改动幅度较大,谷歌将直接删除Dalvik,代替它的是传闻已久的ART。


   Dalvik是Android系统中另一个重要的部分,包括虚拟机和一组重要的运行环境。它的设计非常巧妙,是个很好的一个手机终端的底层应用。本文就简单介绍Dalvik相关的15个问题。   

    1、大部分jvm是基于栈的,而Dalvik是基于寄存器的。       基于栈的机器必须使用指令来载入栈上数据,或是用指令来操纵数据,因此指令集更为庞大。但是对于寄存器指令而言,又必须指定源地址和目的地址,因此,基于寄存器的jvm单个指令更大。 

    2、Dalvik一些特点:       a)常量池32位索引       b)默认栈12kb,3个页,每页4kb       c)默认启动堆2MB,最大值16MB,最小1MB       d)堆最大支持1024MB       e)堆和栈的参数可以通过-Xms和-Xmx更改       

    3、所有的android线程都对应一个linux线程。每个Android Dalvik应用程序都运行在自己的沙盒里,不同的应用在不同的进程空间里运行。       

    4、Dalvik相当于java的JVM,.NET的CLI,Python、Perl、Ruby的Interpreter。Dalvik定义自己的字节码为VM的指令。       

    5、目前Dalvik支持的功能:       a).dex文件       b)Dalvik指令集       c)J2ME CLDC API(  J2ME(Java2 Platform, Micro Edition) Java2平台微型版      CLDC(Connected, Limited Device Configuration) 连接受限设备配置 )         d)多线程       

    6、Dalvik支持的平台有:       a)基于Unix的系统       b)Linux       c)BSD (

BSD (Berkeley Software Distribution伯克利软件套件)是Unix的衍生系统,在1977至1995年间由加州大学伯克利分校开发和发布的。历史上, BSD曾经被认为是UNIX的一支——"BSD UNIX", 因为它和AT&T UNIX操作系统共享基础代码和设计。在20世纪80年代,衍生出了许多变形的UNIX授权软件。比较著名的如DEC的Ultrix及Sun公司的SunOS。1990年代,BSD很大程度上被System V4.x版以及OSF/1系统所取代,晚期BSD版本为几个开源软件开发提供了平台并且一直沿用至今。今天,“BSD”并不特指任何一个BSD衍生版本,而是类UNIX操作系统中的一个分支的总称。)   

   d)Mac OSX    

(OS X是苹果公司为Mac系列产品开发的专属操作系统。基于UNIX系统。OS X是苹果Mac系列产品的预装系统,处处体现着简洁的宗旨。)  

    7、Dalvik 虚拟机实现位于 dalvik/目录下,dalvik/vm是虚拟机的实现部分,被编译为libdvm.so( 是安卓执行应用程序的dalvik虚拟机,安卓应用程序通过它来解释执行),而dalvik/libdex被编译成libdex.a静态库作为dex工具库;dalvik/dexdump是.dex文件的反编译工具。虚拟机的可执行程序位于dalvik/dalvikvm中,将被编译为dalvikvm可执行程序。       

    8、Dalvik需要的其他库:       a)OpenSSl 加密技术       b)Zlib 免费的一般目的数据压缩库       c)ICU 字符编码技术       d)java包 包括java.nio,java.lang,java.util       e)Apache Harmony classlibApache HttpClient       

   9、Dalvik虚拟机的运行库大部分是用可移植的C写的,除了JNI call bridge。       

   10、Dalvik不遵循java SE和java ME的API规范,所以不支持AWT或者Swing。      

   11、dalvik/vm/Dvm.mk 中会根据dvm_arch来选择编译的目标集体系结构。       

   12、dx工具:位于dalvik/dx目录,用于将字节码转换成.dex。       例:dx --dex --output=helloworld.dex helloworld.class       

   13、dexdump工具:位于dalvik/dexdump目录,用于反编译dex文件。       

   14、dex数据类型: byte 8bit ubyte 8bit short 16bitlittle-endian ushort 16bit little-endian int 32bitlittle-endian uint 32bitlittle-endian long 64bitlittle-endian ulong 64bitlittle-endian sleb128 LEB128 variable-lengtha uleb128 LEB128 variable-lengtha uleb128p1 LEB128 variable-lengtha       LEB128类型:1~5个字节组成。所有字节组合在一起代表一个32位值。除最后一个字节最高标志位为0外,其他都为1,剩下的7位为有效负荷。有符号的LEB128的符号由最后一个字节的有效负荷最高位决定。具体算法在:dalvik/libdex/LEB128.h。       

   15、dex文件被映射到DexMapList,结构体定义在dalvik/libdex/DexFile.h(c) 中。