构建 Pixel 内核

本指南分步说明了如何下载、编译和刷写自定义 Pixel 内核以用于开发。得益于 GKI,现在可以在独立于 Android 平台 build 的情况下更新内核。这些步骤仅适用于 Pixel 6 及更新型号的 Pixel 设备。这是因为 Pixel 5 及更低版本的设备需要更新 vendor 分区上的内核模块,而该分区依赖于针对这些设备的 Android 平台 build。GKI 支持的 Pixel 内核分支表包含 GKI 支持的每个 Pixel 设备的内核仓库清单分支。如需了解 Pixel 5 及更早版本的内核清单分支,请参阅旧版 Pixel 内核部分。

GKI 支持的 Pixel 内核分支
设备 AOSP 树中的二进制文件路径 仓库分支 GKI 内核
Pixel 9 Pro Fold (comet) device/google/comet-kernels/6.1 android-gs-comet-6.1-android15-qpr1 android15-6.1
Pixel 9 (tokay)
Pixel 9 Pro (caiman)
Pixel 9 Pro XL (komodo)
device/google/caimito-kernels/6.1 android-gs-caimito-6.1-android15-qpr1 android15-6.1
Pixel 8a (akita) device/google/akita-kernels/5.15 android-gs-akita-5.15-android15-qpr1 android15-5.15
Pixel 8 (shiba)
Pixel 8 Pro (husky)
device/google/shusky-kernels/5.15 android-gs-shusky-5.15-android15-qpr1 android15-5.15
Pixel Fold (felix) device/google/felix-kernels/5.10 android-gs-felix-5.10-android15-qpr1 android15-5.10
Pixel Tablet (tangorpro) device/google/tangorpro-kernels/5.10 android-gs-tangorpro-5.10-android15-qpr1 android15-5.10
Pixel 7a (lynx) device/google/lynx-kernels/5.10 android-gs-lynx-5.10-android15-qpr1 android15-5.10
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
device/google/pantah-kernels/5.10 android-gs-pantah-5.10-android15-qpr1 android15-5.10
Pixel 6a (bluejay) device/google/bluejay-kernels/5.10 android-gs-bluejay-5.10-android15-qpr1 android15-5.10
Pixel 6 (oriole)
Pixel 6 Pro (raven)
device/google/raviole-kernels/5.10 android-gs-raviole-5.10-android15-qpr1 android15-5.10

除了出厂支持的内核之外,Pixel 6 和 Pixel 6 Pro 设备仅在受支持的 Pixel 6/Pixel 6 Pro Android 平台和内核组合表中包含的 Android 通用内核分支上支持用于 GKI 开发。由于 Android 平台 HAL 和 Pixel 内核驱动程序之间的供应商 UAPI 差异,下表提供了受支持的 build 组合。

受支持的 Pixel 6/Pixel 6 Pro Android 平台和内核组合
Pixel 内核清单分支 GKI 分支 Android 平台 build aosp-main 支持?
gs-android-gs-raviole-mainline android-mainline (v6.8) AP1A.240505.004 (11583682)
android14-gs-pixel-6.1 android14-6.1 AP1A.240505.004 (11583682)
gs-android13-gs-raviole-5.15 android13-5.15 TQ1A.230205.002 (9471150) 不参加

准备您的 Pixel 设备

以下流程图介绍了在 Pixel 6 及更新型号的 Pixel 设备上更新内核的流程:

**图 1.** 内核更新流程图

使用 flash.android.com 刷写设备

  1. 前往 flash.android.com
  2. 根据支持的 Android 平台和内核组合选择 Android build。
  3. 选择以下选项:
    • 擦除设备
    • 强制刷写所有分区
    • 停用验证
  4. Install build(安装 build)按钮刷写设备。

**图 2.** 刷写站示例

下载并编译内核

同步内核仓库

您可以运行以下命令来下载内核源代码。请参阅适用于 Pixel KERNEL_MANIFEST_BRANCH受支持的 Pixel 6/Pixel 6 Pro Android 平台和内核组合表。

repo init -u https://android.googlesource.com/kernel/manifest -b KERNEL_MANIFEST_BRANCH
repo sync -c --no-tags

更新供应商 ramdisk

更新内核仓库中的文件 vendor_ramdisk-DEVICE.img,以匹配在设备上刷写的 Android 平台 build。有几个选项可供采用。

选项 1) 从 Pixel 出厂映像中提取供应商 ramdisk 映像。
  1. https://developers.google.com/android/images 下载设备支持的出厂映像。

  2. 解压缩 vendor_boot.img

    • 下述命令以 Pixel 6 Pro AP1A.240505.004 为例。将 zip 文件名替换为所下载出厂映像的文件名。
      unzip raven-ap1a.240505.004-factory-9d783215.zip
    
      cd raven-ap1a.240505.004
    
      unzip image-raven-ap1a.240505.004.zip vendor_boot.img
    
  3. 解压缩 vendor_boot.img 以获取供应商 ramdisk。

      KERNEL_REPO_ROOT/tools/mkbootimg/unpack_bootimg.py --boot_img vendor_boot.img \
          --out vendor_boot_out
    
  4. 将解压缩的 vendor-ramdisk-by-name/ramdisk_ 文件复制到 Pixel 内核仓库。

    设备 DEVICE_RAMDISK_PATH
    Pixel 6 (oriole)
    Pixel 6 Pro (raven)
    prebuilts/boot-artifacts/ramdisks/vendor_ramdisk-oriole.img
    Pixel 6a (bluejay) private/devices/google/bluejay/vendor_ramdisk-bluejay.img
      cp vendor_boot_out/vendor-ramdisk-by-name/ramdisk_ \
          KERNEL_REPO_ROOT/DEVICE_RAMDISK_PATH
    
选项 2) 从本地构建的 Android 平台仓库中复制 vendor_ramdisk
设备 DEVICE_RAMDISK_PATH
Pixel 6 (oriole)
Pixel 6 Pro (raven)
prebuilts/boot-artifacts/ramdisks/vendor_ramdisk-oriole.img
Pixel 6a (bluejay) private/devices/google/bluejay/vendor_ramdisk-bluejay.img
cp ANDROID_ROOT/out/target/product/DEVICE/vendor_ramdisk-debug.img \
   KERNEL_REPO_ROOT/DEVICE_RAMDISK_PATH/vendor_ramdisk-DEVICE.img

编译内核 (Kleaf)

在 Android 13 中,build.sh 脚本已替换为 Kleaf 的新内核构建系统。对于搭载 android13-5.15 及更高版本的设备,应使用 Kleaf 构建内核。

对于搭载 android14 及更高版本内核的 Pixel 6 和 Pixel 6 Pro,请运行 Kleaf 构建命令:

tools/bazel run --config=fast --config=stamp //private/google-modules/soc/gs:slider_dist

对于搭载 android13-5.15 内核的 Pixel 6 和 Pixel 6 Pro,请运行 Kleaf 构建命令:

tools/bazel run --lto=thin //gs/google-modules/soc-modules:slider_dist

对于所有其他 Pixel 内核,请运行 KERNEL_REPO_ROOT 中的 build_DEVICE.sh 脚本。在大多数情况下,DEVICE 所用的代号需与 GKI 支持的 Pixel 内核分支表格 AOSP 树中的二进制文件路径列中所用的代号保持一致。该字符串可以是一个设备的代号,例如“akita”(Pixel 8a),也可以是代表一组共用内核的相关设备的代号,例如“caimito”(表示 Pixel 9 [tokay]、Pixel 9 Pro [caiman] 和 Pixel 9 Pro XL [komodo])。对于 android14 及更早版本,请对 Pixel 6 和 Pixel 6 Pro 使用 build_slider.sh,对 Pixel 7 和 Pixel 7 Pro 使用 build_cloudripper.sh

例如,如需在分支 android-gs-raviole-5.10-android14 上为 Pixel 6 构建内核,您应运行以下命令:

build_slider.sh

默认情况下,build_DEVICE.sh 脚本使用预构建的 GKI 内核来加速构建流程。如果要修改核心内核,请设置环境变量 BUILD_AOSP_KERNEL=1 以改为从本地源代码构建内核。

如需详细了解内核构建系统以及如何自定义 build,请参阅 Kleaf - 使用 Bazel 构建 Android 内核

刷写内核映像

注意:如果您尚未停用验证,则需要在刷写自定义内核之前停用。用于执行此操作的命令如下:
fastboot oem disable-verification
警告:如果您要在平台 build 之上刷写自定义内核,并且存在与新内核相关联的安全补丁级别 (SPL) 降级,则可能需要擦除设备。 此过程会清除您的所有个人数据。擦除前请务必备份您的数据。
fastboot -w

如需刷写内核映像,请针对为设备列出的每个内核分区运行 fastboot flash 命令。对于动态分区,您需要重新启动,进入 fastbootd 模式,才能刷写。

设备 内核分区
Pixel 6 (oriole)
Pixel 6 Pro (raven)
Pixel 6a (bluejay)
boot
dtbo
vendor_boot
vendor_dlkm(动态分区)
Pixel 8 (shiba)
Pixel 8 Pro (husky)
Pixel Fold (felix)
Pixel Tablet (tangorpro)
Pixel 7a (lynx)
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
boot
dtbo
vendor_kernel_boot
vendor_dlkm(动态分区)
system_dlkm(动态分区)

以下是在 android-mainline 上适用于 Pixel 6 的刷写命令:

fastboot flash boot        out/slider/dist/boot.img
fastboot flash dtbo        out/slider/dist/dtbo.img
fastboot flash vendor_boot out/slider/dist/vendor_boot.img
fastboot reboot fastboot
fastboot flash vendor_dlkm out/slider/dist/vendor_dlkm.img

您可以在 DIST_DIR 中找到内核映像。

内核分支 DIST_DIR
v5.10 out/mixed/dist
v5.15 及更高版本 out/DEVICE/dist
注意:如果您有串行加密狗并且想要启用串行日志,请使用以下命令:
fastboot oem uart enable
fastboot oem uart config 3000000
从主机进行连接的示例命令:
screen -fn /dev/ttyUSB* 3000000

恢复出厂映像

如需将设备恢复为出厂映像,您可以使用 flash.android.com

旧版 Pixel 内核

旧版 Pixel 内核分支表提供了适用于 Pixel 5 及更低版本设备的内核仓库分支,以供参考。这些是非 GKI 支持的设备。

旧版 Pixel 内核分支
设备 AOSP 树中的二进制文件路径 仓库分支
Pixel 5a (barbet)
Pixel 4a (5G) (bramble)
Pixel 5 (redfin)
device/google/redbull-kernel android-msm-redbull-4.19-android14-qpr3
Pixel 4a (sunfish) device/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr3
Pixel 4 (flame)
Pixel 4 XL (coral)
device/google/coral-kernel android-msm-coral-4.14-android13
Pixel 3a (sargo)
Pixel 3a XL (bonito)
device/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (blueline)
Pixel 3 XL (crosshatch)
device/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2 (walleye)
Pixel 2 XL (taimen)
device/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Pixel (sailfish)
Pixel XL (marlin)
device/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2