安卓系统主要启动流程如下:
- 启动电源以及系统启动
- 引导程序 BootLoader
- Linux 内核启动
- init 进程启动
- Zygote 进程启动
- SystemServer 进程启动
- Launcher 启动
一、init 进程启动过程
init 过程启动过程中主要做了以下三件事:
- 创建和挂在启动所需的目录文件
- 初始化和启动属性服务:属性服务采用键值对的形式记录用户、软件的一些使用信息,使得系统或者软件重启之后可以根据注册表中的记录进行相应的初始化工作。
- 解析 init.rc 配置文件并启动 Zygote 进程(调用 Zygote 的 main 函数)
二、Zygote 进程启动过程
Zygote 进程被称为安卓系统的孵化器,Zygote 进程在启动时会创建 DVM(Dalvik虚拟机)和 ART(Android Runtime),后续其他的应用程序进程和 SystemService 进程都有 Zygote 进程通过 fork (复制进程)的方式创建。(因此应用程序进程和 SystemService 进程可以在内部获得一个 DVM 和 ART 副本)。
Zygote 进程的启动过程主要做了以下几件事:
- 创建 AppRuntime 并调用其 start 方法,启动 Zygote 进程:main 函数中通过 init 进程调用时携带的参数判断出此时是在启动 Zygote 进程,因此调用 start 方法
- 创建 Java 虚拟机并为其注册 JNI 方法:在 AppRuntime 的 start 方法中调用
- 通过 JNI 调用 ZygoteInit 的 main 函数进入 Zygote 的 Java 框架层:在 AppRuntime 的 start 方法中调用
- 通过调用 ZygoteServer 的 registerServerSocket 方法创建服务端 Socket:在 ZygoteInit 的 main 方法中调用
- 启动 SystemServer 进程:在 ZygoteInit 的 main 方法中调用 startSystemServer 方法完成创建和启动
- 通过调用 ZygoteServer 的 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程:在 ZygoteInit 的 main 方法中调用,runSelectLoop 方法是一个死循环
三、SystemServer 启动过程
由上文可知 ZygoteInit 的 main 方法调用 startSystemServer 方法,startSystemServer 方法首先复制 Zygote 进程创建 SystemServer 进程,接着关闭掉对 SystemServer 进程没有用处的 Socket 服务,最后调用 handleSystemServerProcess 方法启动 SystemServer 进程。
handleSystemServerProcess 方法主要做了以下几件事:
- 启动 Binder 线程池,获得与其他进程通信的能力:通过 ZygoteInit 类中的 zygoteInit 方法调用 native 方法完成启动
- 创建 SystemServerManager,用于对系统的服务进行创建、启动和生命周期管理
- 通过 SystemServerManager 启动各种系统服务
SystemServerManager 会依次启动以下三种服务:
- startBootstrapServices(启动引导服务):ActivityManagerServer 、PackageManagerServer等
- startCoreServices(启动核心服务):BatteryServer 、UsageStateServer(手机用户每一个App使用频率和时长)等
- startOtherServices(启动其他服务):CameraServer 、WindowManagerServer等
四、Launcher 进程启动过程
在 SystemServerManager 调用 startOtherServices 启动其他服务时,通过 AMS 的 systemReady 方法启动 Launcher 进程
参考书籍:《Android 进阶解密》
|