第4章 Android启动过程的上层实现

Android启动过程涉及的内容很多,流程比较复杂。第3章分析了Android启动过程的底层实现,包括三个主要过程:1)bootloader加载内核;2)内核启动1号进程init;3)init执行Action和Service。本章将接着第3章的内容继续分析启动过程的上层实现,这部分内容是理解框架层设计与实现的基础。启动过程的流程如图4-1所示。

第4章 Android启动过程的上层实现 - 图1

图 4-1 Android启动流程

图4-1主要包括以下9个步骤:

1)init启动的核心Daemon服务包括Android世界的第一个Dalvik虚拟机zygote。

2)zygote中定义一个Socket,用于接收ActivityManagerService启动应用程序的请求。3)zygote通过fork系统调用创建system_server进程。

4)在system_server进程的init1和init2阶段分别启动Native System Service和Java System Service。

5)系统服务启动后会注册到ServiceManager中,用于Binder通信。

6)ActivityManagerService进入systemReady状态。

7)在systemReady状态,ActivityManagerService会与zygote的Socket通信,请求启动Home。

8)zygote收到ActivityManagerService的连接请求,执行runSelectLoopMode处理请求。

9)zygote处理请求会通过forkAndSpecialize启动新的应用进程,并最终启动Home。

下面首先从zygote开始分析。

4.1 第一个Dalvik虚拟机zygote

zygote是受精卵的意思,它是Android中一个非常重要的守护进程服务(Daemon Service),所有其他Dalvik虚拟机进程都是通过zygote孵化(fork)出来的。Android应用程序是由Java语言编写的,运行于各自独立的Dalvik虚拟机中。如果每个应用程序在启动之时都需要单独运行和初始化一个虚拟机,会大大降低系统性能,因此Android首先创建一个zygote虚拟机,然后通过它孵化出其他的虚拟机进程,进而共享虚拟机内存和框架层资源,这样可以大幅度提高应用程序启动和运行速度。

4.1.1 zygote的配置

zygote是在init.rc中定义的Daemon Service,其符合Android初始化语言的规范。首先定位到init.rc中zygote配置部分,代码如下:


service zygote/system/bin/app_process-Xzygote/system/bin

—zygote—start-system-server

class是一个Option项,指定zygote服务的类型是main

class main

Socket是一个Option,创建一个名为/dev/socket/zygote的Socket

Socket的类型是stream,权限是660

socket zygote stream 660 root system

onrestart是一个Option,设置zygote服务重启时需要执行的Command

onrestart write/sys/android_power/request_state wake

onrestart write/sys/power/state on

onrestart restart media

onrestart restart netd


这里用service关键字定义了一个名为zygote的服务,服务程序的路径是/system/bin/app_process,给服务程序传入了4个参数:-Xzygote、/system/bin、—zygote、—start-system-server,这些参数的作用将在下一节介绍。zygote服务需要开启一个Socket,并且在zygote重启时,需要执行以下4条命令:

修改/sys/android_power/request_state

修改write/sys/power/state

重启media

重启netd

分析了zygote的配置信息,接下来分析zygote服务程序是如何执行的。