3、Dalvik
Dalvik是一个开源软件,最开始由名叫Dan Bornstein的人进行编写的。Android 4.4之前的版本一直使用Dalvik虚拟机。应用程序一般使用java进行编写,并编译成java虚拟机字节码,然后被转制成Dalvik字节码并保存在.dex(Dalvik执行字节码)文件和.odex(优化后的Dalvik执行字节码)文件中。
Dalvik虚拟机跟java虚拟机不同。java虚拟机是基于栈的(stack machines),而Dalvik使用基于寄存器的架构(register-based
architecture)(需要更少的复杂的虚拟机指令集)。dx工具将java生成的.class文件转换成.dex格式,多个class文件保存在一个.dex文件中。被多个class文件使用的strings和常量在.dex文件中只会包含一份存根以节省空间。
当应用安装时Dalvik可执行文件.dex可能会被再一次修改。为了进一步优化,字节码可能被交换顺序,简单的数据结构和功能lib库可能在内部进行链接(linked inline)。
为了优化内存占用,Dalvik虚拟机跟其他java虚拟机相比做了以下处理:①对虚拟机做了精简以节省空间;②常量池已被修改为仅使用32位索引,以简化解释;③标准的Java字节码执行8位栈指令集,局部变量必须拷贝或通过指令从栈中指定,而Dalvik使用自己的16位指令集直接操作局部变量,局部变量一般从4字节的虚拟寄存器中取出。这些使得更少的Dalvik指令数目并提升了翻译执行速率。