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