一、系统架构总况
官方文档:架构概览 | Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture?hl=zh-cn
下面是Google Android 提供的最新架构层次图:
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 系统服务 | 系统服务是重点突出的模块化组件,例如 Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。 |
Android Runtime 系统运行库层(ART) | AOSP 提供的 Java 运行时环境。 ART 会将应用的字节码转换为由设备运行时环境执行的处理器专有指令。 |
HAL 硬件抽象层 | HAL 是一个抽象层,其中包含硬件供应商要实现的标准接口。 HAL 让 Android 无需关注较低级别的驱动程序实现。 借助 HAL,可以顺利实现相关功能,而不会影响或更改更高级别的系统。详情参阅 HAL 概览。 |
System Service and Daemons 系统服务和守护进程 | Daemons 守护进程。 该层中的原生守护程序包括 该层中的原生库包括 |
Linux Kernel 内核层 | 抽象层,存在软硬件之间。驱动。 内核是任何操作系统的中心部分,并与设备上的底层硬件进行通信。尽可能将 AOSP 内核拆分为与硬件无关的模块和特定于供应商的模块。 AOSP 内核组件的说明(包括其定义)详情请参阅内核概览。 |
Android 大致可以分为四层架构:(2020年《第一行代码(第3版)》 ,比Google少了硬件抽象层的描述)
- Linux内核层
- 系统运行库层
- 应用框架层
- 应用层
按照Google 之前提供,Android 系统架构分为五层:(自上而下)
- 应用层
- 应用架构层
- 系统运行库层
- 硬件抽象层
- Linux内核层
二、各层级说明
(一)应用层 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 内核和供应商模块架构:
内核有多种类型(但是看不懂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的版本,详见说明参见下文。
旧版内核 (<=4.19) | Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture/kernel/previous-kernel-overview?hl=zh-cn
长期支持 (LTS) 内核
受支持 2 到 6 年的 Linux 内核。LTS 内核每年发布一次,是 Google 每个 ACK 的基础。
另外官网还提到了分支,软件开发关注被mainline的部分,因为其内功能不能客制化,因此OEM需要寻找这部分的解决方案,不然只能follow Google。