1.启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM,然后执行。
2.引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
设备制造商要么使用很受欢迎的引导程序比如redboot、uboot、qibootloader或者开发自己的引导程序,它不是Android操作系统的一部分。引导程序是OEM厂商或者运营商加锁和限制的地方。
引导程序分两个阶段执行:
第一个阶段,检测外部的RAM以及加载对第二阶段有用的程序;
第二阶段,引导程序设置网络、内存等等。这些对于运行内核是必要的,为了达到特殊的目标,引导程序可以根据配置参数或者输入数据设置内核。
3.Linux内核kernel开始启动,找到init.rc文件并启动init进程
4.init进程挂载目录,解析init.rc文件,然后启动zygote进程。
5.创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。
注意,Zygote进程与其它进程的交互方式是Socket方式,不是Binder方式,这是出于安全性上的考虑。
Binder方式虽然高效,但是Binder的使用看起来就像是客户端直接通过所持有的引用对象调用了服务端的方法,类似于一种强引用调用。如果Zygote进程使用Binder方式,一旦被客户端的调用造成出错进而崩溃,手机系统将会重启。Zygote进程负责孵化出各个子进程,其地位非常重要,出于安全性的考虑,该场景下的Zygote进程的交互采用Socket会更合适。
6.SystemServer进程启动
启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
核心服务:
启动序号 服务名
1 启动电源管理器;
2 创建Activity管理器;
3 启动电话注册;
4 启动包管理器;
5 设置Activity管理服务为系统进程;
6 启动上下文管理器;
7 启动系统Context Providers;
8 启动电池服务;
9 启动定时管理器;
10 启动传感服务;
11 启动窗口管理器;
12 启动蓝牙服务;
13 启动挂载服务。
其他服务:
启动序号 服务名
1 启动状态栏服务;
2 启动硬件服务;
3 启动网络状态服务;
4 启动网络连接服务;
5启动通知管理器;
6启动设备存储监视服务;
7启动定位管理器;
8 启动搜索服务;
9 启动剪切板服务;
10启动登记服务;
11启动壁纸服务;
12启动音频服务;
13启动耳机监听;
14启动AdbSettingsObserver(处理adb命令)。
7.Launcher启动
被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。