Boot ROM
按下电源之后引导芯片代码从预定义的位置执行,加载bootloader引导程序到内存中
Boot Loader
是系统开始运行前的一小段程序。
Windows如果装了双系统,开机之后会出现一个选择要运行的系统的界面,用户可以自主选择要运行的系统。这个就是bootLoader程序。
主要的作用是初始化硬件参数引导,装载真正的系统,
Linux内核
启动idle进程,设置系统环境,初始化内存结构,硬件参数,加载驱动,挂载根文件系统,加载重要的系统配置文件。启动init进程,进入用户空间
init进程
Linux系统分为用户空间和内核空间,init进程是第一个用户进程(pid=1),是之后出现的所有进程的祖先。
解析init.rc配置文件,rc配置文件由Android初始化语言(Android Init Language)编写,一种脚本语言。启动Zygote,ServiceManager进程
装载进程信号处理器。用于接收子进程在终止时发出的信号,以便及时清理无用进程,释放系统资源。信号是一种Liunx进程间通信机制,使用时需要注册函数。
启动属性服务,实际上是socket,用于监听系统属性改变请求。
ServiceManager
系统Binder服务管家,它并不负责实际通信功能,核心工作是注册和查找服务。ServiceManager记录服务名和Binder句柄的引用。其他服务可以通过服务名获取到对应的Binder句柄进行通信。
ServiceManager进程在初始化时打开binder驱动,注册成守护进程,进入死循环等待接收客户端请求。
Zygote
解析启动参数,创建AppRuntime 创建并启动Java虚拟机,注册JNI函数。通过JNI方式调用ZygoteInit.main() 进入Java层
进入Java层后,解析初始化参数,预加载进程资源通用类、drawable和color资源、openGL以及共享库,WebView用于提高app启动效率。创建socket,作为进程间通信方式,用于接收AMS创建新进程的请求。
fork SystemServer进程
最后进入无限循环休眠等待,接收到创建新进程的请求唤醒工作。
SystemServer
JavaFramework核心用于创建,管理所有系统服务。
初始化设置,system_server进程的上下文信息。创建系统服务管理类 SystemServiceManager启动所有系统服务,添加到SystemServiceManager中。将系统服务划分为三个类型,对应三个方法
引导服务startBootstrapServices,
核心服务startCoreServices
其他服务。startOtherServices
SystemServiceManager 结合 SystemService类 。赋予 AMS,WMS,PKMS等所有系统服务生命周期的概念,由SystemServiceManager 统一管理,把系统服务初始化流程规划为如同所示的几个阶段
startOtherServices 方法中,所有服务陆续初始化完毕之后,
调用ActivityManagerService.systemReady(Runnable) 表明所有服务都已初始化完毕。在systemReady 中,启动Launcher App。在Runnable 回调中,启动systemUI,
系统服务开始运行,SystemServer启动完成,调用Looper.loop() 准备接收消息。
用户已经可以正常操作系统,启动流程完毕。
参考文章
Android系统启动流程(上) - 知乎 (zhihu.com)
Android 操作系统架构开篇 - Gityuan博客 | 袁辉辉的技术博客