前一章节,参考了‘老罗的Android之旅’,基于Android6.0完成了从APP到内核的一整条通路的梳理,了解了一些基本的通信原理,API调用,以及相关进程的启动,但是很多人对Android按下电源键后,到UI加载的这一整个过程还不是很了解,接下来就让我们一起来解开这神秘的面纱,看看Android是如何启动的。
在《Android硬件抽象层(HAL层)学习计划》这一章节的时候,我画出了一张Android的启动图,如图1所示:
Android的启动主要有下面6步来完成:
第一步:手机开机后,引导芯片启动,引导程序到RAM,bootloader检查RAM,初始化硬件等参数
第二步:硬件等参数初始化完成后,进入到Kernel层,Kernel层主要加载一些硬件设备驱动,初始化进程管理等操作
第三步:Kernel层加载完毕后,硬件设备驱动与HAL层进行交互。初始化进程管理等操作会启动INIT进程 ,这些在Native层中
第四步:init进程(是所有进程的鼻祖,第一个启动)启动后,会启动adbd,logd等用户守护进程,并且会启动service Manager等重要服务,同时记载zygote进程,这里属于C++ Framework,代码为C++程序
第五步:zygote是init进程解析init.rc文件后fork生成,它会加载虚拟机,启动System Server;System Server负责启动和管理整个Java sFramework
第六步:zygote同时会启动相关的APP进程,它启动的第一个APP进程为Launcher,然后启动Email,SMS等进程,所有的APP进程都有zygote fork生成。
通过这六步,我们就能知道按下电源键后,Android在Kernel层加载后,主要的四个进程为 init进程、Zygote进程、system server进程、以及Home-Launcher进程,接下来,我将分别来详细的讲解这四个进程的流程与处理过程。