配套视频:www.bilibili.com/video/BV11K…
你知道 Android 手机开机进程有多复杂吗?短短数秒钟的背面,是很多工程师 996 加班的深夜。 本视频从大体上介绍 Android 体系发动的每一个阶段。
1. Boot ROM
当咱们按下开机键,体系通电后,cpu 会从固定的一个地址取指令并履行,这个固定的地址一般指向 Boot Rom. Boot ROM 是硬编码在 CPU 内部固定地址的一段 ROM,这块代码由 CPU 制造商供给。在必要的硬件初始化之后,Boot ROM 开端加载 Bootloader 到 RAM 中,然后 CPU 跳转履行 Bootloader
2. Bootloader
Bootloader 代码与 CPU 芯片的内核结构、具体型号、运用体系的配置及运用的操作体系等因素有关,因而,并没有通用的 bootloader 程序,开发时需求用户根据具体情况进行移植。嵌入式 Linux 体系中常用的 Bootloader 有 armboot、redboot、blob、U-Boot、Bios-lt 等,其间 U-Boot 是当前比较盛行,功能比较强大的 Bootloader,可以支撑多种体系结构,但相对也比较复杂。
Bootloader 完结由硬件发动到操作体系发动的过渡,从而为操作体系供给基本的运转环境。Bootloader 的履行进程一般可分为两个阶段:
阶段一的首要作业包含了:
- 设置异常向量
- 设置 CPU 速度,时钟频率以及终端
- 初始化内存控制器
阶段二的首要作业首要有:
- 初始化 Flash 设备
- 初始化体系内存
- 初始化显示、网络等设备
- 将 Kernel 和根文件体系从 falsh 加载到 RAM 中
- 设置 Kernel 发动参数,发动 Kernel
3. kernel
Android 的 kernel 实际上就是 Linux kernel,仅仅针对移动设备做了一些优化,所以与其它 Linux kernel 的发动办法迥然不同。
Kernel 发动进程可分为两个阶段:
阶段一一般运用汇编代码编写,首要作业有
- 硬件环境的查看,首要是 查看内核与当前硬件是否匹配
- 汇编环境到 C 环境的初始化
- 0 号进程上下文的初始化
- 跳转到 C 环境下
阶段一初始化了进程环境,进入阶段二后,程序进入了 0 号进程,0 号进程一般称为 swapper,swapper 进程的首要任务包含了:
- 初始化进程管理、内存管理、文件体系等核心基础模块
- 加载各类驱动
- 查找并发动 init 进程,
- 发动 kthreadd 进程,kthreadd 进程用于发动其他内核进程,是一切内核进程的父进程。
4. init
init 进程是 Linux 体系中用户空间的第一个进程,进程号为 1,咱们可以说它是 root 进程或者一切用户态进程的父进程。
init 进程的首要作业包含了:
- 挂载虚拟文件体系:如 /sys、/dev、/proc
- 发动 property 服务
- 发动 SELinux
- 解析履行 init.rc 文件
5. Zygote
在解析履行 init.rc 文件的进程中会发动大量的 native 看护进程 ,这些程序首要有 servicemanager mediaserver zygote 等,其间最重要的进程非 zygote 莫属。
zygote 是 Android 体系最重要的进程之一。后续 Android 中的 App 进程都是由 zygote 进程 fork 出来的。 Zygote 进程中会初始化 java 运转时 AndroidRuntime. 接着经过 AndroidRuntime 履行 ZygoteInit 类的 main 函数,至此,程序就进入 java 环境。
在 ZygoteInit 类的 main 函数会:
- 初始化 Zygote Socket
- 加载 Android Framework 中的 Java 类和 Android 资源到内存中。Android 经过在 zygote 创立的时分加载 Java 类和 Android 资源,当 fork 出子进程后,子进程和父进程共享这些资源,不需求重新加载,加快了运用程序的发动时间。
- 完结资源加载后,接着会发动 SystemServer。
- 最后开启 Zygote Socket 服务,当有发动运用请求到达,fork 生成 App 运用进程。
6. SystemServer
SystemServer 的首要的作用是发动各种体系服务,比如 ActivityManagerService,PackageManagerService,WindowManagerService 以及硬件相关的 Service ,咱们平常熟知的各种体系服务其实都是在 SystemServer 进程中发动的,而当咱们的运用需求运用各种体系服务的时分其实也是经过与 SystemServer 进程通讯获取各种服务对象的句柄进而履行相应的操作的。在一切的服务发动完结后,会调用各服务的 service.systemReady(…) 来通知各对应的服务,体系现已就绪。
SystemServer 发动完一切的服务后,会调用各个服务的 service.systemReady(…) 办法,在 ActivityManagerService.systemReady() 中会经过一个 CATEGORY_HOME 类型的 Intent 发动 Launcher(这里是 Android 10 的逻辑,不同版本可能有差异)
最后 Launcher 发动,整个发动进程完结。