如题所见,这篇文章浅谈一下安卓内核的碎片化。我编译过安卓内核我觉得我应该有话语权.jpg
gki时期
这里指gki2.0时期。gki1.0不在讨论范围内
什么是gki?
通用内核映像 (GKI) 项目通过统一核心内核并将 SoC 和板级支持从核心内核移至可加载模块中,解决了内核碎片化问题。GKI 内核为内核模块提供了稳定的内核模块接口 (KMI),因此模块和内核可以独立进行更新。
GKI 2.0
搭载 Android S (2021) 平台版本且使用内核版本 v5.x(5.x 是 2020 年年底被选为 LTS 的内核版本)或更高版本的设备必须附带 GKI 内核。将提供已签名的启动映像,并通过 LTS 和重大问题修复定期对其进行更新。由于 KMI 将保持二进制稳定性,因此无需对供应商映像进行任何更改,即可安装这些启动映像。
gki的特性
- 基于 ACK 来源构建而成。
- 是每个架构和每个 LTS 版本的单内核二进制文件以及关联的可加载模块(目前只有适用于 android11-5.4 和 android12-5.4 的 arm64)。
- 已经过关联 ACK 支持的所有 Android 平台版本的测试。在 GKI 内核版本的生命周期内不会发生功能弃用。
- 为给定 LTS 中的驱动程序提供了稳定版 KMI。
- 不包含 SoC 专用代码或板卡专用代码。
这就意味着只要内核是gki内核,就可以通刷同内核大版本(例如5.15.xxx)的内核。
某些厂商将私有代码集成在了内核里面。刷入gki内核将丢失私有代码所产生的特性。例如小米的机器刷完gki后会丢快充。
非gki时期
主要指的是内核版本为4.x或3.x的内核版本时期。这一阶段,厂商内核的碎片化是极其严重的。
一般地,android kernel的来源是这样的:
linux kernel > aosp kernel > 供应商添加soc或外围设备的驱动及特性 > oem厂商添加附加特性 > android kernel
供应商内核和设备内核位于 ACK 的下游。供应商通过修改内核源代码并添加设备驱动程序,添加了对 SoC 和外围设备的支持。这些修改内容可能很多,以至于设备上运行的代码中有多达 50% 是树外代码,并非来自上游 Linux 和 AOSP 通用内核。
几乎所有设备都具有自定义内核。这就导致了内核碎片化问题。
aosp kernel
众所周知,android不是gnu/linux,这就意味着aosp kernel和linux kernel会有一些不同。
AOSP通用内核(也称为 Android 通用内核或 ACK)是 kernel.org 内核的下游,包含与 Android 社区相关但尚未合并到 Mainline 内核或长期支持 (LTS) 内核的补丁程序。这些补丁程序可能包括:
- Android 功能所需的向后移植和精选的上游功能
- 可供 Android 设备使用但仍处于上游开发阶段的功能(例如,Energy Aware Scheduler 任务放置优化)。
- 对其他生态系统合作伙伴有用的供应商/原始设备制造商 (OEM) 功能(例如,sdcardfs)。
目前 Android 通用内核也分以下两种:
- 功能内核
包含最新 Android 平台版本功能的增强内核称为功能内核。对于 Android 11,功能内核基于内核版本 4.14.y、4.19.y 和 5.4.y。在过去的平台版本中,功能内核与启动内核相同。但在 Android 12 中,将有两个功能内核和三个启动内核。
- 启动内核
指定的启动内核可用于启动搭载特定 Android 平台版本的设备。对于 Android 11,可以使用基于内核版本 4.14.y、4.19.y 和 5.4.y 的内核启动设备。
每个 Android 平台版本都支持基于三个 Linux 内核版本中的任何一个启动新设备。例如Android 11 的启动内核为 android-4.14-stable、android-4.19-stable 和 android11-5.4。
由于更新平台版本时通常不需要升级内核,因此缺少平台版本最新功能的内核仍然可以用来启动设备。因此,即使设备上的平台版本已升级到 Android 11,为 Android 10 设计的内核(例如 android-4.19-q)也可以在设备上使用。
这就导致某些厂商秉承着能用就行的原则,能不升级内核版本就不升级内核版本。吃力可能不讨好的事厂商不会去干。
厂商不升级内核版本导致了Android 框架代码必须假设支持的内核版本多达 5 个,并且没有针对新的平台版本进行任何内核更改(Android 10 支持内核版本 3.18、4.4、4.9、4.14 和 4.19;在某些情况下,这些版本自 2017 年 Android 8 发布以来还未添加新功能)。
supplier kernel
供应商在aosp kernel的基础上添加设备(相机,屏幕等)的驱动或特性所产生的内核。
oem kernel
oem厂商在supplier kernel后添加大量私有特性后所发布的源码。大部分厂商都是非实时开源的。
通俗讲就是一次性开源,后续安卓版本更新内核代码不会及时提交。
而且厂商会添加大量私有特性在内核源码中。
例如华为会在config里添加大量海思麒麟的特性。
而OPPO会将私有特性配置在xxxfetures.mk里。
-------------本文结束感谢您的阅读-------------