安卓基础 | AOSP 架构与内核

Android 开放系统平台 (AOSP) 是公开发布且可修改的 Android 源代码。

任何人都可以下载并修改其设备的 AOSP。AOSP 提供 Android 移动平台的完整且功能完备的实现。

注意:AOSP 无法为需要后端服务的应用(例如云消息传递或高级位置信息服务应用)提供支持。此外,AOSP 并没有包含特定类型的设备可能需要的一整套最终用户应用。

AOSP 架构

AOSP 的软件堆栈包含以下层:

Android 应用

完全使用 Android API 开发的应用。Google Play 商店广泛用于查找和下载 Android 应用,不过也有许多其他替代方案。在某些情况下,设备制造商可能希望预安装 Android 应用以支持设备的核心功能。

如果您对开发 Android 应用感兴趣,请访问 developers.android.com

特权应用

使用 Android 和系统 API 组合创建的应用。这些应用必须作为特权应用预安装在设备上。

设备制造商应用

结合使用 Android API、系统 API 并直接访问 Android 框架实现而创建的应用。由于设备制造商可能会直接访问 Android 框架中的不稳定的 API,因此这些应用必须预安装在设备上,并且只能在设备的系统软件更新时进行更新。

系统 API

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

Android API

Android API 是面向第三方 Android 应用开发者的公开 API。如需了解 Android API,请参阅 Android API 参考文档。

通过这些附加库,您可以轻松地向应用添加其他功能和特性。

Android 框架

构建应用所依据的一组 Java 类、接口和其他预编译代码。框架的某些部分可通过使用 Android API 公开访问。框架的其他部分只能由 OEM 通过系统 API 来访问。Android 框架代码在应用进程内运行。

系统服务

系统服务是重点突出的模块化组件,例如 system_server、SurfaceFlinger 和 MediaService。Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。

Android 运行时 (ART)

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

硬件抽象层 (HAL)

HAL 是一个抽象层,其中包含硬件供应商要实现的标准接口。借助 HAL,Android 可以忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。如需了解详情,请参阅 HAL 概览。

在 Android 8.0 及更高版本中,较低级别的层已重新编写以采用更加模块化的新架构。搭载 Android 8.0 或更高版本的设备必须支持使用 HIDL 语言编写的 HAL,下面列出了一些例外情况。这些 HAL 可以是绑定式 HAL 也可以是直通式 HAL。Android 11 也支持使用 AIDL 编写的 HAL。所有 AIDL HAL 均为绑定式。

绑定式 HAL。以 HAL 接口定义语言 (HIDL) 或 Android 接口定义语言 (AIDL) 表示的 HAL。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和旧版 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。
直通式 HAL。以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。

原生守护程序和库

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

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

内核

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

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

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

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

注意:GKI 内核、GKI 模块和供应商模块架构是我们多年来一直致力于开展的通用内核映像 (GKI) 项目的成果。

内核术语表

本部分包含整个内核文档中使用的术语。

内核类型
  • Android 通用内核 (ACK)
    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 的设备类似。
  • 通用核心内核
    在所有设备上通用的 GKI 内核部分。
  • 通用内核映像 (GKI) 内核
    任何较新的(5.4 及更高版本)ACK 内核(目前仅限 aarch64)。此内核包含两个部分:代码在所有设备上通用的核心 GKI 内核,以及由 Google 开发的可在设备上(如适用)动态加载的 GKI 模块。
  • 内核模块接口 (KMI) 内核
    请参阅 GKI 内核。
  • 启动内核
    对于启动指定 Android 平台版本的设备有效的内核。例如,在 Android 12 中,有效的启动内核为 4.19、5.4 和 5.10。
  • 长期支持 (LTS) 内核
    受支持 2 到 6 年的 Linux 内核。LTS 内核每年发布一次,是 Google 每个 ACK 的基础。

分支类型

  • ACK KMI 内核分支
    构建 GKI 内核的分支。例如,android12-5.10 和 android13-5.15。
  • Android-mainline
    Android 功能的主要开发分支。当上游声明新的 LTS 内核时,相应的新 GKI 内核就会作为 android-mainline 分支。
  • Linux Mainline
    上游 Linux 内核(包括 LTS 内核)的主要开发分支。

其他术语

  • 经过认证的启动映像
    以二进制文件形式 (boot.img) 分发并刷写到设备上的内核。此映像经过认证,因为它包含嵌入式证书,因此 Google 可以验证确认设备搭载的内核经过 Google 认证。
  • 可动态加载的内核模块 (DLKM)
    可以在设备启动过程中根据设备需求动态加载的模块。GKI 和供应商模块都是 DLKM。DLKM 以 .ko 形式发布,可以是驱动程序,也可以提供其他内核功能。
  • GKI 项目
    一种 Google 项目,通过将通用核心内核功能从特定于供应商的 SoC 和板级支持分离为可加载模块,解决了内核碎片化问题。
  • 通用内核映像 (GKI)
    经过 Google 认证的启动映像,包含基于 ACK 源代码树构建的 GKI 内核,适合刷写到 Android 设备的启动分区。
  • KMI
    GKI 内核与供应商模块之间的接口,使供应商模块能够独立于 GKI 内核进行更新。此接口包括已根据合作伙伴符号列表标识为供应商/OEM 依赖项的内核函数和全局数据。
  • GKI 模块
    由 Google 构建的可在设备上动态加载的内核模块(若适用)。这些模块构建为 GKI 内核的工件,并与 GKI 一起作为 system_dlkm_staging_archive.tar.gz 归档提供。GKI 模块由 Google 使用内核构建时密钥对进行签名,并且仅与其构建时使用的 GKI 内核兼容。
  • 供应商模块
    由合作伙伴开发的硬件专用模块,包含 SoC 和设备专用功能。供应商模块是一种可动态加载的内核模块。

Android 通用内核

AOSP 通用内核(也称为 Android 通用内核或 ACK)是 kernel.org 内核的下游,包含与 Android 社区相关但尚未合并到 Mainline 内核或长期支持 (LTS) 内核的补丁。这些补丁可能包括:

  • Android 功能所需的向后移植和精选的上游功能
  • 可供 Android 设备使用但仍处于上游开发阶段的功能
  • 对其他生态合作伙伴有用的供应商/原始设备制造商 (OEM) 功能

android-mainline 是 Android 功能的主要开发分支。每当 Linus Torvalds 发布内核版本或候选内核版本时,Linux Mainline 内核就会合并到 android-mainline 中。

在 2019 年之前,Android 通用内核是通过克隆最新声明的 LTS 内核并添加 Android 专用补丁程序来构建的。

2019 年,这一过程变成了从 android-mainline 中分支出新的 Android 通用内核。这种新模型以递增的方式构建内核,从而避免进行大量的向前移植和测试 Android 补丁程序的工作。

android-mainline 会经过大量持续不断的测试,因此该模型可保证内核自发布之日起就具有很高的质量。

当上游声明新的 LTS 时,相应的通用内核就会从 android-mainline 分支出来。这样,合作伙伴就可以在上游声明 LTS 版本之前,通过从 android-mainline 进行合并来开始项目。创建新的通用内核分支后,合作伙伴可以将合并来源无缝更改为新的分支。

其他通用内核分支从其关联 LTS 内核接收定期合并。这些合并通常会在 LTS 版本发布后立即执行。例如,Linux 6.1.75 发布后,便合并到了 6.1 通用内核 (android14-6.1) 中。强烈建议合作伙伴更新其内核,以便及时获取最新的 LTS 和特定于 Android 的 bug 修复。

功能内核和启动内核

在 Android 15(AOSP 实验版)之前,三个近期内核中的任意一个都可以用于设备启动。从 Android 15(AOSP 实验版)开始,两个近期内核版本可用于设备启动。Android 15(AOSP 实验版)的启动内核为 android15-6.6 和 android14-6.1。

由于更新平台版本时不需要升级内核,因此缺少平台版本最新功能的内核仍然可以用来启动设备。所以,即使设备上的平台版本已升级到 Android 15(AOSP 实验版),为 Android 14 设计的内核(例如 android14-6.1)也可以在设备上使用。

如果您已针对平台版本更新关联的 BSP,则可能还需要遵守其他限制。一般来说,内核的 Android 版本号必须高于或等于目标 FCM 版本。如需了解详情,请参阅供应商接口对象 - 匹配内核分支。

参考资料

https://developer.android.com/reference

相关推荐
天天扭码31 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
余生H1 小时前
transformer.js(三):底层架构及性能优化指南
javascript·深度学习·架构·transformer
凡人的AI工具箱1 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
运维&陈同学2 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
Dnelic-2 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen4 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年12 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿14 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
哔哥哔特商务网14 小时前
一文探究48V新型电气架构下的汽车连接器
架构·汽车
007php00714 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang