Android AOSP 架构和各层次开发内容介绍

一、系统架构总况​​​​

官方文档:架构概览  |  Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture?hl=zh-cn

下面是Google Android 提供的最新架构层次图:

AOSP 的软件堆栈
图. AOSP 的软件堆栈层次

System API 表示仅供合作伙伴和 OEM 纳入捆绑应用的 Android API。这些 API 在源代码中被标记为 @SystemApi。

Android API 是面向第三方 Android 应用开发者的公开 API。详情请参阅 Android API 参考文档

层次(自上而下)

Layer Comment

Apps

应用层

通过 Android API 或 System API 与FW交互。

- Android Apps:仅使用Android API来开发的应用。

- Privileged Apps:特权应用,使用Android和系统API组合创建的应用,必须预安装在设备上。

Device Manufacturer Apps:设备制造商应用,使用Android和系统API并直接访问Android框架实现而创建的应用(此类APP可以之间跟FW交互,不一定有中间层API,可能会直接访问Android FW中不稳定的API),必须原装在设备上,并且只能在设备的系统软件更新时进行更新。

Android Framework

框架层

构建应用所依据的一组 Java 类、接口和其他预编译代码。

框架的某些部分可通过使用 Android API 公开访问。

框架的其他部分只能由 OEM 通过系统 API 来访问。

Android 框架代码在应用进程内运行。

System Service

系统服务

系统服务是重点突出的模块化组件,例如 system_server、SurfaceFlinger 和 MediaService。

Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。

Android Runtime

系统运行库层(ART)

AOSP 提供的 Java 运行时环境。

ART 会将应用的字节码转换为由设备运行时环境执行的处理器专有指令

HAL 硬件抽象层

HAL 是一个抽象层,其中包含硬件供应商要实现的标准接口。

HAL 让 Android 无需关注较低级别的驱动程序实现。

借助 HAL,可以顺利实现相关功能,而不会影响或更改更高级别的系统。详情参阅 HAL 概览

System Service and Daemons

系统服务和守护进程

Daemons 守护进程。

该层中的原生守护程序包括 inithealthdlogd 和 storaged。这些守护程序直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。

该层中的原生库包括 libclibloglibutilslibbinder 和 libselinux。这些原生库直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。

Linux Kernel 内核层

抽象层,存在软硬件之间。驱动。

内核是任何操作系统的中心部分,并与设备上的底层硬件进行通信。尽可能将 AOSP 内核拆分为与硬件无关的模块和特定于供应商的模块。

AOSP 内核组件的说明(包括其定义)详情请参阅内核概览

Android 大致可以分为四层架构:(2020年《第一行代码(第3版)》 ,比Google少了硬件抽象层的描述)

  1. Linux内核层
  2. 系统运行库层
  3. 应用框架层
  4. 应用层

按照Google 之前提供,Android 系统架构分为五层:(自上而下)

  1. 应用层
  2. 应用架构层
  3. 系统运行库层
  4. 硬件抽象层
  5. Linux内核层
图:Android 系统架构
图. Android 系统架构

二、各层级说明

(一)应用层 APP

与用户直接交互,支持Java和Kotlin开发。

(二)应用架构层 FW

该层由Java语言代码编写,提供上层应用程序需要的API(Application Programming Interface)。

开发工程师需要熟悉常用的系统服务组件。

  • ActivityManaer
  • PackageManager
  • TelephonyManager
  • ....

(三)系统运行库层 ART

该层包含 native C/C++ 和 Android 运行时库两部分。

Native C/C++ 原生程序库
  • OpenGL ES
  • Media Framework

Android Runtime 运行时库

Runtime Library 又分为核心库(Core Libraries)和ART。Android 5.0 之后,Dalvik虚拟机被ART取代。

(四)硬件抽象层 HAL/HIDL

位于OS内核和硬件电路直接的接口抽象层。屏蔽不同硬件厂商的差异,因此特定平台的硬件接口细节,为OS提供虚拟的硬件平台,实现多平台可移植性。

该层可以实现软硬件测试工作,包含完成控制硬件的动作操作。

(五)内核层 LK

Android 的核心服务都基于 Linux 内核,

- Android 内核基于上游 Linux 长期支持 (LTS) 内核。在 Google,LTS 内核会与 Android 专用补丁结合,形成所谓的“Android 通用内核 (ACK)”。

- 较新的 ACK(版本 5.4 及更高版本)也称为 GKI 内核。GKI 内核支持将与硬件无关的通用核心内核代码和 GKI 模块与硬件专用供应商模块分离开来。

- GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现,该接口由标识供应商模块所需的函数和全局数据的符号列表组成。图

下图显示了 GKI 内核和供应商模块架构:

图 1. GKI 架构
图. GKI 架构

内核有多种类型(但是看不懂ACK等等),参考:内核概览  |  Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture/kernel?hl=zh-cn#gkik

Android 通用内核 (ACK)

Android 通用内核  |  Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture/kernel/android-common?hl=zh-cn

ACK 是长期支持 (LTS) 内核的下游,包含与 Android 社区相关但尚未合并到 Linux Mainline 或 LTS 内核的补丁。较新的 ACK(版本 5.4 及更高版本)也称为 GKI 内核,因为它们支持将与硬件无关的通用内核代码和与硬件无关的 GKI 模块分离开来。

Android 开源项目 (AOSP) 内核详情请参阅 Android 通用内核

软件开发能看懂的内核说明:

功能内核

确保实现平台版本功能的内核。例如,在 Android 12 中,两个功能内核为 android12-5.4 和 android12-5.10。Android 12 功能无法向后移植到 4.19 内核,功能集与在发布时搭载 R 4.19 并升级到 S 的设备类似。

启动内核

对于启动指定 Android 平台版本的设备有效的内核。例如,在 Android 12 中,有效的启动内核为 4.19、5.4 和 5.10。

在软件项目开发中,遇到“kernel升级”的开发工作也就是这一层。比如K419升级到K510,是由于Android 系统版本功能支持性决定的。

旧版内核在AOSP中定义是指小于等于4.19的版本,详见说明参见下文。

旧版内核 (

长期支持 (LTS) 内核

受支持 2 到 6 年的 Linux 内核。LTS 内核每年发布一次,是 Google 每个 ACK 的基础。

另外官网还提到了分支,软件开发关注被mainline的部分,因为其内功能不能客制化,因此OEM需要寻找这部分的解决方案,不然只能follow Google。

图. Android 内核分支类型
图. Android 内核分支类型

上一篇:React前端框架入门教程:从零开始构建一个简单的任务管理应用


下一篇:stm32学习之路——LED闪烁实验