首页 > 解决方案 > 从 Android 11 引入的使用 GKI 的 Android 内核构建流程

问题描述

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

最近,为了解决内核碎片,AOSP 似乎正在将内核分成两个不同的块。
(1) GKI(Generic Kernel Image)
(2) Vendor specific kernel

对于 GKI,我想我可以使用来自 ci.android.com 的图像。
对于 Vendor 特定部分(与 vendor_boot 分区相关),

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

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

标签: android-source

解决方案


实际上,使用 GKI(通用内核映像),通用部分和供应商部分是分开的。到今天为止,这种区别非常明显:vmlinux是 GKI,任何模块 ( *.ko) 都是供应商。如果 GKI 模块显示有用的话,这可能会在未来发生变化。然后可能是 GKI(内核+模块)+ 供应商模块。

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

Android 11为基于 GKI 的内核引入了“合规性”的概念。这意味着交付的内核与 GKI 内核的 ABI 兼容。从理论上讲,这意味着您可以从字面上换掉您拥有的内核,并将其替换为来自 ci.android.com 的构建版本。请注意,兼容的内核可能具有 GKI 没有的重要(ABI 兼容)补丁。因此,虽然兼容,但可能不会带来相同的体验。

Android 12允许使用包含 GKI 内核的签名启动映像启动设备。由于这些内核的Kernel<>Module 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 上的一般说明的相关步骤 - 构建内核


推荐阅读