简介

AMS 是 Android 中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它本身也是一个 Binder 的实现类,应用进程能通过 Binder 机制调用系统服务。

安卓启动流程图:

下面依次讲解各个层的含义:

1. Loader 层

1.1 电源与系统启动

按下开机键之后,固化在ROM的引导代码开始执行,加载引导程序到RAM,之后开始运行。

1.2 引导程序

引导程序是 Android 操作系统开始运行的前一个程序,也是第一个程序,所以是针对于特定的主板与芯片,可以使用redboot,uboot,qibootloader或者开发自己的引导程序,它不是 Android 操作系统的一部分,引导程序是 OEM厂商(原设备制造商) 或者运营商加锁的地方。

  1. RedBoot:

    • RedBoot 是一个开源的嵌入式系统引导程序,通常用于嵌入式系统的启动和调试。它提供了一些调试和管理功能,如网络启动、固件更新等。

  2. U-Boot(Universal Bootloader):

    • U-Boot 是一个流行的开源引导程序,广泛应用于嵌入式系统和嵌入式 Linux 设备中。它具有丰富的功能和支持多种处理器架构,如 ARM、MIPS、PowerPC 等。

  3. Qi Bootloader:

    • Qi Bootloader 是一个轻量级的开源引导程序,主要用于支持基于 Linux 的嵌入式系统。它专注于快速启动和加载 Linux 内核。

2. Kernel 层

它是 Android 的内核层,这里一般是刚开机结束,进入 Android 系统,内核层的启动流程如下:

  1. 启动 swapper 进程(pid=0),这是 系统初始化过程中 Kernel 创建的第一个进程,用于初始化进程管理,内存管理,加载 DisplayCameraBinder 等驱动相关工作。

    swapper 进程是系统中一个特殊的内核线程,比如上述的内存管理就是 把暂时不活动的活动移动到交换分区,这样就能释放内存供活跃活动使用

  2. 启动 kthreadd 进程,这是 Linux 系统的内核进程,会创建内核工作线程kworkder、软中断线程ksoftirqdthermal等内核守护进程。kthreadd是所有内核进程的鼻祖。

    1. kworker:

      • kworker 是内核中的工作线程,用于执行各种内核工作队列中的任务。这些任务可能涉及设备驱动、文件系统操作、内存管理等。kworker 线程通常在后台运行,处理各种异步任务,以减轻内核的负担。

    2. ksoftirqd:

      • ksoftirqd 是软中断线程,用于处理软中断(softirq)任务。软中断是一种在内核中处理高优先级任务的机制,通常用于处理网络数据包、定时器事件等。ksoftirqd 线程负责处理软中断任务,以确保系统的响应性能和实时性。

    3. thermal:

      • thermal 是用于处理系统温度管理的内核守护进程。在 Android 设备中,thermal 进程负责监控设备的温度情况,并根据设定的策略来调节 CPU 频率、降低性能或触发散热措施,以防止设备过热并保护硬件。

    这些内核工作线程和内核守护进程在 Android 系统中起着重要的作用,确保系统的正常运行、性能优化和硬件保护。它们负责处理各种内核任务、中断和系统管理工作,以保证系统的稳定性和可靠性。

3.HAL 层

也叫硬件抽象层,这是一个中间层,处于操作系统内核和硬件电路之间的接口层,目的在于将硬件抽象花,这样就可以保护硬件厂商的知识产权。采用了封装的思想,隐藏了硬件的接口细节,为操作系统提供虚拟硬件平台,这样还可以方便的在各种平台之间移植。

4. Native 层

native层主要包括有init进程孵化的用户空间的守护进程,bootanim开机动画和hal层等。init是Linux系统的守护进程,是所有用户空间进程的鼻祖。init进程是Linux系统中用户空间的第一个进程,进程号固定为1

  • init进程会孵化出ueventdlogdhealthdinstalldadbd、lmkd等用户守护进程。

  • init进程还会启动ServiceManager(Binder服务管家)、bootanim(开机动画)等重要服务。

  • init进程孵化出 zygote 进程,Zygote 进程是 Android 系统的第一个 Java进程(虚拟机进程),zygote进程是所有Java进程的父进程。

5. Framework 层

  • Zygote 进程,是由 init进程 通过解析 init.rc文件 后 fork 生成的,Zygote进程 主要包含: - 加载 ZygoteInit类,注册 Zygote Socket服务端套接字; - 加载虚拟机; - PreloadClasses; - PreloadResouces。

  • Zygote进程 fork 出 System Server进程,System Server 是 Zygote 孵化的第一个进程,地位非常重要。

  • System Server进程:负责启动和管理整个 Java framework,包含 ActivityManager,PowerManager 等服务。

  • Media Server进程:负责启动和管理整个C++ framework,包含 AudioFlinger,Camera Service 等服务。

6. App 层

  • Zygote进程 孵化出的第一个 App进程 是 Launcher,这是用户看到的 桌面App。

  • Zygote进程 还会创建 Browser,Phone,Email 等 App进程,每个 App 至少运行在一个进程上。

  • 所有的 App进程 都是由 Zygote进程 fork 生成的。

7. 总结

以上的启动流程其实是非常粗略的,并不细致,目的在于去了解开机启动流程,为后续的学习做好准备。