配套视频:www.bilibili.com/video/BV11K…

你知道 Android 手机开机进程有多复杂吗?短短数秒钟的背面,是很多工程师 996 加班的深夜。 本视频从大体上介绍 Android 体系发动的每一个阶段。

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 发动,整个发动进程完结。

参考资料