本文主要内容
- Android设备启动过程
- init进程
- 关键服务启动简析
Android设备启动过程
Android设备启动过程分为3个阶段,即Boot Loader,Linux Kernel和Android系统服务,默认情况下它们都有各自的启动动画。
init进程是Android上启动的第一个进程,它通过解析init.rc脚本来构建出系统的初始运行状态,它会启动一系列服务。
init进程
先来看看init.rc的语法。
一个完整的init.rc脚本由4种类型的声明组成,即:
- Action,动作
- Commands,命令
- Services,服务
- Options,选项
1、Actions
动作的一般格式如下:
一个Action,其实就是响应某事件的过程,即当<trigger>所描述的触发事件产生时,依次执行各种command。
常见的trigger如下图:
常见的command就有很多了,比如启动某个服务等。
2、Service
Service,这里就是指可执行程序,它们会在特定选项的约束下被init程序运行或者重启。它的一般格式为:
3、init.rc 实例分析
如上图所示,这是一个action实例,当系统启动时,触发boot事件,则创建dev目录。
如上图所示,这是一个Service实例,启动zygote。
关键服务启动简析
我们看看ServiceManager是如何被启动的。
ServiceManager,它的可执行程序在/system/bin/servicemanager中,init.rc中指定它为core,并且声明它是非常重要的系统进程 critical,并且当ServiceManager重启时,zygote等进程也要重启。
zygote进程,也是由init.rc所启动的,Android中大多数应用进程和系统进程都是通过zygote来生成的,例如上层应用的进程都是由zygote fork出来的。
值得一提的是,zygote 启动后会启动虚拟机。
如上图init.rc中所示,启动zygote时,指定了参数--start-system-server,那么zygote就会启动SystemServer。如首节Android启动过程图所示,SystemServer是用户承载各种Java系统服务的进程,比如ams,pms等等。当SystemServer启动ams完成之后,ams再启动launcher,于是,用户就能看到手机桌面了。