### Android Dalvik虚拟机的启动过程源码分析 #### 一、概述 在深入探讨Dalvik虚拟机(Dalvik Virtual Machine, DVM)的启动过程之前,我们需要了解DVM的基本概念及其在Android系统中的作用。DVM是Android操作系统中运行应用程序的核心组件之一,负责执行已编译好的.dex文件。它在Android平台上的地位类似于Java虚拟机(JVM)在Java平台上的角色。 #### 二、Zygote进程与DVM的关系 Android系统中,每个应用程序进程都由Zygote进程孵化而来。Zygote进程是Android系统在启动过程中由Init进程启动的一个特殊进程,它负责初始化并创建DVM实例。当用户启动一个应用程序时,Zygote进程会创建一个新的进程,并将自己内部的DVM实例复制到新进程中,这样每个应用程序都可以拥有自己的独立DVM实例。 #### 三、DVM启动过程详解 ##### 3.1 Zygote进程启动流程 1. **Zygote进程的创建**:Zygote进程由Init进程启动,它会加载必要的库文件,并初始化环境。 2. **DVM实例的创建**:Zygote进程中会创建一个DVM实例,并将其保存在进程内存中。 3. **JNI方法注册**:Zygote进程中还会注册一些核心类的JNI方法,这些方法允许C/C++代码直接调用Java层的方法。 4. **Java运行时库加载**:Zygote进程会加载Java运行时库,并与其他进程共享这些库,以此来提高内存利用率。 ##### 3.2 AndroidRuntime类的start函数 Zygote进程启动的关键在于`AndroidRuntime`类的`start`函数,该函数主要完成以下几个任务: 1. **调用startVm创建DVM实例**:这是启动DVM的关键步骤,通过调用`startVm`函数创建DVM实例,并将其保存在`mJavaVM`成员变量中。 2. **注册JNI方法**:通过调用`startReg`函数注册JNI方法。这些方法是预先定义好的,用于C/C++代码调用Java层的接口。 3. **启动Java层入口**:通过调用参数`className`所描述的Java类的静态成员函数`main`,作为Zygote进程的Java层入口。这个入口类通常是`com.android.internal.os.ZygoteInit`。 4. **清理工作**:在`ZygoteInit`类的`main`方法执行完毕后,会调用DVM实例的`DetachCurrentThread`和`DestroyJavaVM`函数,分别用于将主线程脱离DVM实例和销毁DVM实例。 #### 四、DVM实例的创建与JNI方法注册 ##### 4.1 创建DVM实例 创建DVM实例的过程涉及到`startVm`函数,该函数主要执行以下操作: 1. **初始化JNI环境**:通过JNI接口初始化DVM,并获取DVM的句柄。 2. **设置DVM选项**:可以指定一系列选项来调整DVM的行为,如`-Xcheck:jni`等。 3. **加载类路径**:设置类路径,加载必要的类库。 4. **启动DVM**:最终通过JNI接口启动DVM。 ##### 4.2 注册JNI方法 注册JNI方法的步骤如下: 1. **定义JNI方法**:首先需要定义要注册的JNI方法。 2. **注册JNI方法**:通过调用`startReg`函数注册这些方法。这些方法会在DVM启动后立即可用。 3. **调用JNI方法**:在C/C++代码中,可以通过JNI接口调用这些注册的Java方法。 #### 五、总结 通过对Zygote进程启动过程的深入了解,我们可以看到DVM的启动不仅仅涉及到了DVM实例的创建,还包含了JNI方法的注册和Java运行时库的加载等多个方面。这一过程充分利用了Linux内核的特性,如进程复制机制(fork),实现了高效的应用程序进程启动机制。此外,通过Zygote进程孵化应用程序进程的方式,既提高了启动速度又减少了内存占用,尽管可能会略微影响开机速度,但整体上带来了显著的好处。
- 粉丝: 7339
- 资源: 37
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助