Iibchara-dev(讨论 | 贡献) |
|||
(未显示2个用户的6个中间版本) | |||
第1行: | 第1行: | ||
=== ''' | === 介绍 === | ||
'''通用内核映像 (GKI) 项目'''通过统一核心内核并将 SoC 和板级支持从核心内核移至可加载的供应商模块中,解决了内核碎片化问题。GKI 还为供应商模块提供稳定的内核模块接口 (KMI),因此模块和内核可以独立进行更新。GKI 内核的一些特性包括: | |||
* GKI 内核基于 ACK 源代码构建而成。 | |||
* GKI 内核是每个架构和每个 LTS 版本的单内核二进制文件以及关联的可加载模块(目前只有适用于 <code>android11-5.4</code> 和 <code>android12-5.4</code> 的 arm64)。 | |||
* GKI 内核已经过关联 ACK 支持的所有 Android 平台版本的测试。在 GKI 内核版本的生命周期内不会发生功能废弃。 | |||
* GKI 内核为给定 LTS 中的驱动程序提供了稳定版 KMI。 | |||
* GKI 内核不包含 SoC 专用代码或板级代码。 | |||
GKI 是一项复杂的更改,将从 Android 11 平台版本中的 v5.4 内核开始,分几个阶段逐步推出。 目前存在两个 GKI 阶段: | |||
* | ** GKI 1.0 是在 Android 11 中面向搭载 5.4 内核的设备推出的。GKI 1.0 适用于所有附带 5.4 内核的设备,乃至发布时搭载 Android 12 或 Android 13 的设备。 | ||
* | ** GKI 2.0 是在 Android 12 中面向搭载 5.10 内核的设备推出的,是附带 5.10 或更高版本内核的所有设备的新标准。 | ||
* | |||
* | |||
=== '''<big>GKI 1.0内核和GKI 2.0内核的区别</big>''' === | === '''<big>GKI 1.0内核和GKI 2.0内核的区别</big>''' === | ||
GKI1.0内核与GKI2.0最大的区别就是使 OEM 无需供应商参与即可提供内核安全修复和问题修复 (LTS),简单来说就是1.0只能算OEM内核的GKI,还是属于aosp内核的下游,例如MTK平台的GKI,<u>高通平台的GKI,也就是人们常说的QGKI(qcom-gki)</u>,而2.0才能直接使用Google所维护aosp内核。 | |||
''''' | '''''小知识:不少手机厂商随着GKI2.0内核的发展,纷纷都开始直接使用Google编译好的GKI2.0内核,如内核的 suffix 以g开头,那就是Google所编译的GKI内核。 例:5.10.101-android12-9-g30979850fc20,g30979850fc20就是 suffix 部分''''' | ||
=== '''<big>GKI内核与boot分区的改动</big>''' === | === '''<big>GKI内核与boot分区的改动</big>''' === | ||
* 在 <code>ro.board.first_api_level=29</code> | * 在 <code>ro.board.first_api_level=29</code>及小于29的boot镜像中(内核版本4.19及以下),boot镜像包含通用的 ramdisk 和内核。 | ||
* 在 <code>ro.board.first_api_level=30</code> | * 在 <code>ro.board.first_api_level=30</code>的boot镜像中(内核版本5.4),boot镜像包含通用的 ramdisk 和OEM GKI内核。 | ||
* 在 <code>ro.board.first_api_level=31</code> 和<code>ro.board.first_api_level=32</code> | * 在 <code>ro.board.first_api_level=31</code> 和<code>ro.board.first_api_level=32</code>的boot镜像中(内核版本5.10),boot 镜像包含通用的 ramdisk 和 Google GKI 内核。 | ||
* 对于发布时搭载 <code>ro.board.first_api_level=33</code>及大于33 | * 对于发布时搭载 <code>ro.board.first_api_level=33</code>及大于33 的设备(内核版本5.15及以上),通用 ramdisk 将从 boot 镜像中移除,并放置在单独的 init_boot 镜像中。此更改会使 boot 镜像仅保留 Google GKI 内核。因为 magisk 需要修补RamDisk,来获取root权限,因此在 <code>ro.board.first_api_level=33</code>及大于33 的设备需要提取 init_boot 镜像进行修补。 | ||
==== '''如何查看 <code>ro.board.first_api_level=?</code>'''(下列方法二选一) ==== | ==== '''如何查看 <code>ro.board.first_api_level=?</code>'''(下列方法二选一) ==== | ||
第44行: | 第43行: | ||
'''''小知识:4. | '''''小知识:4.19版本的Android内核是具有GKI特性的,只不过没有加入KMI功能,只在Google pixel机型上支持,属于内测版本。''''' | ||
=== '''<big> | === '''<big>KMI接口</big>''' === | ||
KMI 全称 Kernel Module Interface,相同 KMI 的内核版本是兼容的 这也是 GKI 中“通用”的含义所在;反之,如果 KMI 不同,那么这些内核之间无法互相兼容,刷入与你设备 KMI 不同的内核镜像可能会导致死机。 | KMI 全称 Kernel Module Interface,相同 KMI 的内核版本是兼容的 这也是 GKI 中“通用”的含义所在;反之,如果 KMI 不同,那么这些内核之间无法互相兼容,刷入与你设备 KMI 不同的内核镜像可能会导致死机。 | ||
具体来说,对 GKI 的设备,其内核版本格式应该如下: | 具体来说,对 GKI 的设备,其内核版本格式应该如下: | ||
<strong>KernelRelease :=</strong> | |||
<table> | <table> | ||
<tr> | <tr> | ||
<td>Version</td> | <td>Version</td> | ||
第68行: | 第66行: | ||
<td>-zzz</td> | <td>-zzz</td> | ||
<td>-k</td> | <td>-k</td> | ||
<td>-something | <td>-something</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
第76行: | 第74行: | ||
<td>-android12</td> | <td>-android12</td> | ||
<td>-9</td> | <td>-9</td> | ||
<td>-g30979850fc20</td> | <td style="border: none; white-space: nowrap;">-g30979850fc20</td> | ||
</tr> | </tr> | ||
</table> | </table> |
2024年8月18日 (日) 17:35的最新版本
介绍
通用内核映像 (GKI) 项目通过统一核心内核并将 SoC 和板级支持从核心内核移至可加载的供应商模块中,解决了内核碎片化问题。GKI 还为供应商模块提供稳定的内核模块接口 (KMI),因此模块和内核可以独立进行更新。GKI 内核的一些特性包括:
- GKI 内核基于 ACK 源代码构建而成。
- GKI 内核是每个架构和每个 LTS 版本的单内核二进制文件以及关联的可加载模块(目前只有适用于
android11-5.4
和android12-5.4
的 arm64)。 - GKI 内核已经过关联 ACK 支持的所有 Android 平台版本的测试。在 GKI 内核版本的生命周期内不会发生功能废弃。
- GKI 内核为给定 LTS 中的驱动程序提供了稳定版 KMI。
- GKI 内核不包含 SoC 专用代码或板级代码。
GKI 是一项复杂的更改,将从 Android 11 平台版本中的 v5.4 内核开始,分几个阶段逐步推出。 目前存在两个 GKI 阶段:
- GKI 1.0 是在 Android 11 中面向搭载 5.4 内核的设备推出的。GKI 1.0 适用于所有附带 5.4 内核的设备,乃至发布时搭载 Android 12 或 Android 13 的设备。
- GKI 2.0 是在 Android 12 中面向搭载 5.10 内核的设备推出的,是附带 5.10 或更高版本内核的所有设备的新标准。
GKI 1.0内核和GKI 2.0内核的区别
GKI1.0内核与GKI2.0最大的区别就是使 OEM 无需供应商参与即可提供内核安全修复和问题修复 (LTS),简单来说就是1.0只能算OEM内核的GKI,还是属于aosp内核的下游,例如MTK平台的GKI,高通平台的GKI,也就是人们常说的QGKI(qcom-gki),而2.0才能直接使用Google所维护aosp内核。
小知识:不少手机厂商随着GKI2.0内核的发展,纷纷都开始直接使用Google编译好的GKI2.0内核,如内核的 suffix 以g开头,那就是Google所编译的GKI内核。 例:5.10.101-android12-9-g30979850fc20,g30979850fc20就是 suffix 部分
GKI内核与boot分区的改动
- 在
ro.board.first_api_level=29
及小于29的boot镜像中(内核版本4.19及以下),boot镜像包含通用的 ramdisk 和内核。
- 在
ro.board.first_api_level=30
的boot镜像中(内核版本5.4),boot镜像包含通用的 ramdisk 和OEM GKI内核。
- 在
ro.board.first_api_level=31
和ro.board.first_api_level=32
的boot镜像中(内核版本5.10),boot 镜像包含通用的 ramdisk 和 Google GKI 内核。
- 对于发布时搭载
ro.board.first_api_level=33
及大于33 的设备(内核版本5.15及以上),通用 ramdisk 将从 boot 镜像中移除,并放置在单独的 init_boot 镜像中。此更改会使 boot 镜像仅保留 Google GKI 内核。因为 magisk 需要修补RamDisk,来获取root权限,因此在ro.board.first_api_level=33
及大于33 的设备需要提取 init_boot 镜像进行修补。
如何查看 ro.board.first_api_level=?
(下列方法二选一)
- 使用mt管理终端功能,输入
getprop ro.board.first_api_level
- 在开发者调试,开启手机USB调试,使用电脑终端,输入adb shell,授权adb调试权限,输入
getprop ro.board.first_api_level
GKI内核与vendor_boot分区的诞生
Android 11 引入了通用内核映像 (GKI) 的概念。为了能够使用 GKI 轻松启动任意设备,ro.board.first_api_level=30及30以上 设备可以使用启动映像头文件版本 3。在版本 3 中,所有供应商专用信息都已从 boot 分区分离出来并转移到新的 vendor_boot 分区中。
因此,我们需要修改cmdlime来设置Android设备的SELinux为宽容时,应该修改vendor_boot分区中的cmdlime参数,而不是boot或init_boot。
具体参考:供应商启动分区
小知识:4.19版本的Android内核是具有GKI特性的,只不过没有加入KMI功能,只在Google pixel机型上支持,属于内测版本。
KMI接口
KMI 全称 Kernel Module Interface,相同 KMI 的内核版本是兼容的 这也是 GKI 中“通用”的含义所在;反之,如果 KMI 不同,那么这些内核之间无法互相兼容,刷入与你设备 KMI 不同的内核镜像可能会导致死机。
具体来说,对 GKI 的设备,其内核版本格式应该如下:
KernelRelease :=
Version | PatchLevel | SubLevel | AndroidRelease | KmiGeneration | suffix |
w | .x | .y | -zzz | -k | -something |
5 | .10 | .101 | -android12 | -9 | -g30979850fc20 |
其中,w.x-zzz-k 为 KMI 版本。例如,一个设备内核版本为5.10.101-android12-9-g30979850fc20,那么它的 KMI 为 5.10-android12-9;理论上刷入其他这个 KMI 的内核也能正常开机。
请注意:
- 内核版本中的 SubLevel 不属于 KMI 版本的一部分!
- 内核的 KMI 版本与 Android 版本并不一定相同!
- 新的 Android 设备上可能采取了防回滚机制,它不允许刷入一个安全补丁更旧的内核。比如,如果你的设备内核是 5.10.101-android12-9-g30979850fc20,它的安全补丁为 2023-11;即使你刷入与内核 KMI 一致的内核,如果安全补丁级别比 2023-11要老(例如2023-06),那么很可能会无法开机。因此,在保持 KMI 一致的情况下,优先采用安全补丁级别更新的内核!
GKI内核ABI监控
GKI和ABI的关系主要体现在通过ABI监控工具和符号列表来维护和管理KMI的稳定性,以确保内核的稳定和兼容性。
KMI并非包含内核中的所有符号,甚至并非包含完整的3万多个导出符号。相反,可供模块使用的符号都明确列在一组符号列表文件中,这些文件在内核树的根目录中公开维护。所有符号列表文件中所有符号的并集定义了一组作为稳定版维护的KMI符号。
为了减少需要作为稳定版维护的符号的数量和类型,GKI 内核具有将导出符号限制在模块所需符号范围内的功能。对于外部编译的模块,您需要有一个模块使用的符号列表,以便 GKI 内核可以导出这些符号。例如,模块用于小米机型的符号存储在内核源码的 android 目录下。
具体参考:Android 内核 ABI 监控