第四章 Android 虚拟机
4.1 Dalvik 虚拟机简介
Java 语言的一个非常重要的特点就是与平台的无关性。而使用 Java 虚拟机是实现这一特点
的关键。一般的高级语言如果要在不同的平台上运行, 至少需要编译成不同的目标代码。而
引入 Java 语言虚拟机后,Java 语言在不同平台上运行时不需要重新编译。
Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机
上运行的目标代码(字节码), 就可以在多种平台上不加修改地运行。Java 虚拟机在执行字
节码时,把字节码解释成具体平台上的机器指令执行。
Dalvik 的出现是为了躲避 Sun 公司 Java ME 的版权以及授权问题,由 Google 公司自己设计用
于 Android 平台的 Java 虚拟机.
4.2 Dalvik 虚拟机的主要特征
专有的 DEX 文件格式
一个应用中会定义很多类,编译完成后即会有很多相应的 CLASS 文件,CLASS 文件间会有不
少冗余的信息;而 DEX 文件格式会把所有的 CLASS 文件内容整合到一个文件中。这样,除
了减少整体的文件尺寸,I/O 操作,也提高了类的查找速度。 原来每个类文件中的常量池,
在 DEX 文件中由一个常量池来管理。
一个应用,一个虚拟机实例,一个进程
每一个 Android 应用都运行在一个 Dalvik 虚拟机实例里,而每一个虚拟机实例都是一个独立
的进程空间。虚拟机的线程机制,内存分配和管理,Mutex 等等都是依赖底层操作系统实现
的。所有 Android 应用的线程都对应一个 Linux 线程,虚拟机因而可以更多的依赖操作系统
的线程调度和管理机制。
不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的 Linux 用户来运
行,可以最大程度的保护应用的安全和独立运行。
Zygote 是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个
Android 应用程序,Zygote 就会 FORK 出一个子进程来执行该应用程序。这样做的好处显而
易见:Zygote 进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库
的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote 通过复制自身,最
快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和 Zygote 共享一块
内存区域,大大节省了内存开销。
基于寄存器