Android系统的启动流程

Posted by Suzeyu on 2017-02-09

第一个系统进程init

Android设备的启动需要经过Boot Loader, Linux KernelAndroid系统服务三个核心阶段. 默认情况都有其对应的启动动画.

究其本质的话. Android系统并不算一个严格意义上的操作系统. 因为其实际上是运行在Linux内核之上的一系列的服务进程. 而正是因为这些进程才维持了设备的正常工作的关键. 而它们的祖先进程就是init


作为第一个启动的进程, 那么initPID也就是0. 其通过对init.rc脚本来构建系统的初始化形态. 在这个脚本里面会陆续的启动Android的系统服务.

系统关键服务的启动简析

作为系统的第一个进程. 那么init就承担着启动其他系统服务的职责. 其中最主要的就是ServiceManager, Zygote, SystemServer

ServiceManager

ServiceManagerBinder机制中的管理者. 保存着整个系统的所有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

SystemServerAndroid进入Launcher前的最后准备. 它提供了众多由java语言编写的系统服务.

ZygoteInit通过Zygote.forkSystemServer来生成一个新进程, 用于承载各系统服务. Zygote内部有Native层函数来进一步响应, 最终调用底层系统的fork接口来实际产生一个进程.

之后SystemServer中的三个重要的static函数会被执行. 分别是:

  • main: 主函数
  • init1: 这个native函数主要完成本地层Service的启动(SurfaceFlinger, AudioFlinger等). 完成会回调init2
  • init2: 这是Java层各Service被启动的地方(例如AMS,WMS等).