Android内核构建流程与从Android 11引入的GKI



我正试图将Android 11移植到我的主板(odroid-n2(,但我对如何构建特定于主板的内核模块和ramdisk感到困惑。我能得到一些帮助吗?

最近,为了解决内核碎片问题,AOSP似乎将内核划分为两个不同的块
(1(GKI(通用内核映像(
(2(特定于供应商的内核

对于GKI,我认为我可以使用ci.android.com中的图像。
对于供应商特定部分(与Vendor_boot分区相关(,

  1. 有具体的流程吗?或者有什么可以参考的吗
  2. 我参考了{android kernel}/common/build.config.db845c进行案例研究,我不明白为什么要将"gki_defconfig+db845c_gki.fragment"组合为一个来生成内核构建的配置。我认为我们只为供应商特定的部分构建内核模块

*(对于android文档,我指的是以下内容
https://source.android.com/setup/build/building-kernelshttps://source.android.com/devices/architecture/kernel/generic-kernel-image

事实上,使用GKI(Generic Kernel Image(,通用部件和供应商部件是分开的。到目前为止,这种区别非常明显:vmlinux是GKI,任何模块(*.ko(都是供应商。如果GKI模块被证明是有用的,这种情况在未来可能会改变。然后可以是GKI(内核+模块(+供应商模块。

整个构建过程也是相当新的,并且仍在随着Android内核开发方式的根本变化而发展。从历史上看,设备内核和模块是在一个逻辑步骤中构建的,并且通过组合构建来确保兼容性。现在,我们可以干净地构建内核和模块,使其完全分离而不重叠。在未来,构建供应商模块可能会变得容易得多,而不必同时构建太多GKI内核。然而,按照目前的构建方式,设置起来更容易

安卓11引入了";合规性;用于基于GKI的内核。这意味着附带的内核与GKI内核兼容ABI。理论上,这意味着你可以把现有的内核换掉,用ci.android.com的构建来替换它。注意,兼容的内核可以有GKI没有的重要(ABI兼容(补丁。因此,虽然兼容,但可能不会带来相同的体验。

安卓12使设备能够通过包含GKI内核的签名引导映像启动。由于内核<gt;这些内核的模块ABI保持稳定,这也允许独立更新GKI内核和供应商模块。

当您参考db845c构建配置时,是的,这看起来有点令人困惑。这是一个完整的配置,构建确实产生了一个(ABI兼容!(内核和特定于供应商的模块。该片段可以被视为gki_defconfig的补丁,因为它不会更改核心内核,而是启用所需的模块。对于最终版本,此构建的内核映像将被GKI内核映像所取代。但是对于开发来说,这个构建的内核非常适合使用。

在实践中,它有助于下游项目同时开发核心内核功能和模块,尽管模块和内核的更改需要进入不同的存储库(db845c是一个例外,这里是一个参考板(。

为了回答您关于如何构建db845c内核的问题,ci.android.com还提供了构建日志以及要下载的工件。对于android12-5.10分支和目标kernel_db845c,可以在此处找到最新版本。build.log在开始时说明了再现以下内容的指令:

$ BUILD_CONFIG=common/build.config.db845c build/build.sh

这是基于source.android.com构建内核的一般说明的相关步骤。

最新更新