Android 启动分 5 个阶段:

# BootLoader

上电后引导芯片从指定位置加载 bootloader 程序,初始化 ram,
然后启动 linux 内核

# Linux 内核

启动 linux 内核后,会初始化内存管理单元和缓存,进程管理。
加载驱动:Display Driver,Camera Driver, Input,Binder Driver 等。
最后启动 init 进程

# init 进程

linux 内核启动中创建,是内核创建的第一个用户进程,pid 为 1,执行分两个阶段,分别在从内核态和用户态执行。

  • 第一阶段,设置环境变量,创建挂载文件系统,设置 selinux,

  • 第二阶段,初始化启动属性服务,解析 init.rc 文件,启动 ServiceManager, 然后启动 Zygote 进程,最后自身进入一个无限循环等待事件处理。

# Zygote

创建 Java 虚拟机(Dalvik/ART)
注册 JNI 函数
通过 JNI 调用到 zygoteInit.java 类中的 main 方法,第一次进入 Java 世界。
创建一个 Socket 并监听来自 AMS 的 fork 请求
启动 system_server 进程

# system_server

启动 binder 线程池
创建 SystemServiceManager 负责创建其他系统服务
创建 AMS,WMS,PWS,IMS 等系统服务