Android启动流程
1、电源及系统启动
当用户按下电源准备开机时,固化在ROM固定位置的引导芯片代码开始执行,加载引导程序BootLoader到RAM并执行。
开机,开机就是给系统开始供电,此时硬件电路会产生一个确定的复位时序,保证CPU是最后一个被复位的器件,为什么CPU要最后被复位呢?因为,如果CPU第一个被复位,则当CPU复位后开始运行时,其他硬件内部的寄存器状态可能还没有准备好,比如磁盘或者内存,那么久可能出现外围硬件初始化错误。当正确完成复位后,CPU开始执行第一条指令,该指令所在的内存你地址是固定的,这由CPU的制造者指定。不同的CPU可能会从不同的地址获取指令,但这个地址必须是固定的,这个固定地址所保存的程序往往被称为"引导程序(BootLoader)",因为其作用是装载真正的用户程序。
2、引导程序(BootLoader)启动
引导程序BootLoader是一段特殊的代码,它运行在Android操作系统之前,用于负责将操作系统OS运行起来。
3、Linux内核启动
Android本质上是基于Linux内核移植的操作系统,因而Linux内核的启动基本一致,会设置缓存、被保护存储器、计划列表、加载驱动等。当内核完成启动之后,会在系统文件中查找init.rc文件,并启动init进程。
4、init进程启动
init进程是Linux系统中用户空间的第一个进程,它的进程号是1,作为Android系统最重要的进制,它被赋予了很多重要的职责,包括系统的初始化、启动属性服务,并创建Zygote进程,监控用户进程的存活。
5、Zygote进程启动
Zygote进程又称孵化器,它可以fork自身从而创建其他进程,它是Java世界的开创者,创建了Java虚拟机并为Java虚拟机注册JNI方法,创建服务器Socket用于处理其他进程的请求,以便提供新的进程的创建,其中系统中关键的SystemServer进程也是由它来启动。
6、SystemServer进程启动
SystemServer是Android系统的核心之一,大部分Android提供的服务都运行在这个进程里,SystemServer中运行的服务总共有60多种。为了防止应用进程对系统造成破坏,Android的应用进程没有权限直接访问设备的底层资源,只能通过SystemService中的代理访问。Binder的初始化、Binder线程池和SystemServiceManager的启动也是在这里完成。
7、Launcher启动
在SystemServer进程启动之后,AMS会启动Launcher,将已安装的应用显示在桌面上。Android系统的系统流程如下图所示,图中简化了很多细节,想要了解更好,还需要深入的阅读并理解源码。
启动流程图