- 当手机处于关机状态时,长按Power键开机,引导芯片从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM,然后再去执行BootLoader。BootLoader主要是引导操作系统的启动
CPU复位会首先运行在ROM芯片内固化的一段指令(Boot ROM),这段指令会将BootLoader程序加载到内存中并且开始执行。
BootLoader也叫“引导加载程序”,是个底层代码,包含一堆指令,主要分为两部分。
第一部分,检测外部RAM,找到并加载另一段bootloader程序,之后跳到其中执行。
第二部分bootloader,设置运行内核所需的网络、内存等基本条件,之后找到对应的Kernel镜像文件,并将其加载到物理内存中。
经过这一步,Kernel的镜像已经加载到了物理内存的指定地址处,并建立了内核运行所需的基本环境。接下来BootLoader将控制权交给了Kernel,内核开始执行。
- 进入到Kernel层,然后启动Kernel的swapper进程(pid=0),该进程又称Idle进程,Idle进程作为系统启动的第一个进程,用于初始化进程管理、内存管理、加载Display ,Camera Driver,Binder Driver等操作。然后Idle进程又会创建两个进程:
Kernel空间创建kthreadd进程(pid=2)、用户空间创建init进程(pid=1); - init进程会解析init.rc文件后fork出Zygote进程,Zygote进程负责
(1)加载ZygoteInit类,注册Zygote Socket服务端套接字——ZygoteServer
(2)加载虚拟机
(3)提前加载类preloadClasses
(4)提前加载资源preloadResources
(5)ZygoteServer启动Loop的死循环(zygote要一直运行,不能退出。代码模拟杀死zygote进程,Android手机会重启),用于接收AMS发来的消息,进而启动其他进程。 - 紧接着,Zygote进程会fork出SystemServer进程(Zygote孵化的第一个进程);SystemServer会负责启动和管理整个Java Framework,包含AMS、PMS、WMS等服务。App进程的启动时由SystemServer通过AMS通知Zygote,由Zygote进程fork出一个进程,启动app。
- Zygote同时会启动相关的APP进程,它启动的第一个APP进程是Launcher进程、然后启动Email、SMS等进程,所有的App进程都由Zygote进程fork生成。
- 一个进程分为内核空间和用户空间,每一个进程都有自己的内核空间和用户空间。JVM相当于是zygote里创建的一个功能模块,这个功能模块实现了内存管理的功能。