1.1.3 运行时

和所有的Java程序运行平台一样,为了实现Java程序在运行阶段的二次编译,Android为它们提供了运行时(Runtime)的支撑。

Android的运行时由Java核心类库和Java虚拟机Dalvik共同构成。Java核心类库[1]涵盖了Android框架层和应用层所要用到的基础Java库,包括Java对象库、文件管理库、网络通信库,等等。

Dalvik是为Android量身打造的Java虚拟机,负责动态解析执行应用、分配空间、管理对象生命周期等工作。如果说框架层是整个Android的大脑,决定了Android应用的设计特征,那么,Dalvik就是Android的心脏,为Android的应用提供动力,决定它们的执行效率。

与为低端移动设备而设计的J2ME虚拟机不同,Dalvik是专门为高端设备而优化设计的。它没有采用基于栈的虚拟机架构,而是采取了基于寄存器的虚拟机架构设计。通常来说,基于栈的虚拟机对硬件的依赖程度小、生成的应用更节约空间,可以适配更多的低端设备;而基于寄存器的虚拟机,对硬件的门槛会更高一些,编译出的应用可能会耗费稍多的存储空间,但它的执行效率更高,更能够发挥高端硬件(主要指处理器)的能力。

Dalvik没有沿用传统的Java二进制码(Java Bytecode)作为其一次编译的中间文件,而是应用了新的二进制码格式文件.dex。在Android应用的编译过程中,它会先生成若干个.class文件,然后统一转换成一个.dex文件。在转换过程中,Android会对部分.class文件中的指令做转义,使用Dalvik特有的指令集OpCodes[2]来替换,以提高执行效率。同时,.dex会整合多个.class文件中的重复信息,并对冗余部分做全局的优化和调整,合并重复的常量定义,以节约常量池耗费的空间。这使得最终得到的.dex文件通常会比将.class文件压缩打包得出的.jar文件更精简。

为了提升Android应用的执行效率,从垃圾回收器(Garbage Collection, GC)到编译器,Dalvik一直在各个方面进行优化。经常可以听到这样的消息:“新版本的Android系统,比上一个版本的效率高了x倍。”这大都是改善Dalvik的效果。在Android 2.2中,Dalvik引入了对JIT(Just-in-time)编译的支持,将上层应用的执行效率提升了2~4倍,开启了Android发展的新篇章。

由于对于大部分应用开发者而言,无须了解Android运行时的具体细节,因此,本书后续将不会详细介绍Android运行时的相关内容,有兴趣的读者,可以另行查阅相关资料和源代码[3]

[1]它的主要实现来自于开源项目Apache Harmony,其官方主页是:http://harmony.apache.org。

[2]参见如下链接:http://developer.android.comreference/dalvik/bytecode/Opcodes.html。

[3]维基百科是学习Dalvik的一个不错途径:http://en.wikipedia.org/wiki/Dalvik_(software)。