Android系统的启动流程
第一个系统进程init
Android
设备的启动需要经过Boot Loader
, Linux Kernel
和Android系统服务
三个核心阶段. 默认情况都有其对应的启动动画.
究其本质的话. Android系统
并不算一个严格意义上的操作系统. 因为其实际上是运行在Linux内核
之上的一系列的服务进程
. 而正是因为这些进程
才维持了设备的正常工作的关键. 而它们的祖先进程就是init
作为第一个启动的进程, 那么init
的PID
也就是0
. 其通过对init.rc
脚本来构建系统的初始化形态. 在这个脚本里面会陆续的启动Android的系统服务
.
系统关键服务的启动简析
作为系统的第一个进程. 那么init
就承担着启动其他系统服务的职责. 其中最主要的就是ServiceManager
, Zygote
, SystemServer
ServiceManager
ServiceManager
是Binder
机制中的管理者. 保存着整个系统的所有Binder服务端
(例如ActivityManagerService
,WindowManagerService
等), 并且管理着Binder服务端
的名字和句柄
.
SM
是在Init.rc
里描述并由init进程
启动的, 并且SM
是一个Linux的程序
.
SM
所属的class是core
, 其他同类的系统进程包括ueventd
,console
,adbd
等. 根据core
的特性, 这些进程会同时被启动或停止. 另外由于被critical
选项被标注, 说明其是系统的关键进程也就是说如果进程不幸地在4分钟内异常退出超过4次, 则设备将重启并进入还原模式. 当ServiceManager
每次重启时, 其他关键进程如zygote
, media
, SurfaceFlinger
等也会被重启.
Zygote
zygote
根据其字面意思受精卵
可以大概猜出这是会衍生出新的生命的功能模块. 而Android
中大多数应用程序和系统进程都是通过zygote
来生成的.
zygote
不仅预装载各种系统类, 还有一个工作就是启动SystemServer
, 这是大部分Android
系统服务的所在地.
SystemServer
SystemServer
是Android
进入Launcher
前的最后准备. 它提供了众多由java
语言编写的系统服务
.
ZygoteInit
通过Zygote.forkSystemServer
来生成一个新进程, 用于承载各系统服务. Zygote
内部有Native层
函数来进一步响应, 最终调用底层系统的fork
接口来实际产生一个进程.
之后SystemServer
中的三个重要的static
函数会被执行. 分别是:
main
: 主函数init1
: 这个native
函数主要完成本地层Service
的启动(SurfaceFlinger, AudioFlinger等). 完成会回调init2
init2
: 这是Java
层各Service
被启动的地方(例如AMS
,WMS
等).