建構 Pixel 核心

本指南提供逐步操作說明,協助您下載、編譯及刷入自訂 Pixel 核心以進行開發。由於 GKI,現在可以獨立於 Android 平台建構作業更新核心。這些步驟僅適用於 Pixel 6 和後續機型。這是因為 Pixel 5 和舊款裝置必須更新 vendor 分割區上的核心模組,而這取決於這些裝置的 Android 平台建構版本。「支援 GKI 的 Pixel 核心分支」表列出各個支援 GKI 的 Pixel 裝置,以及對應的核心存放區資訊清單分支。如要瞭解 Pixel 5 和舊版核心資訊清單分支版本,請參閱「舊版 Pixel 核心」一節。

GKI 支援的 Pixel 核心分支
裝置 存放區分支版本 GKI 核心
Pixel 9a (tegu) android-gs-tegu-6.1-android16 android14-6.1
Pixel 9 Pro Fold (comet) android-gs-comet-6.1-android16 android14-6.1
Pixel 9 (tokay)
Pixel 9 Pro (caiman)
Pixel 9 Pro XL (komodo)
android-gs-caimito-6.1-android16 android14-6.1
Pixel 8a (akita) android-gs-akita-6.1-android16 android14-6.1
Pixel 8 (shiba)
Pixel 8 Pro (husky)
android-gs-shusky-6.1-android16 android14-6.1
Pixel Fold (felix) android-gs-felix-6.1-android16 android14-6.1
Pixel Tablet (tangorpro) android-gs-tangorpro-6.1-android16 android14-6.1
Pixel 7a (lynx) android-gs-lynx-6.1-android16 android14-6.1
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
android-gs-pantah-6.1-android16 android14-6.1
Pixel 6a (bluejay) android-gs-bluejay-6.1-android16 android14-6.1
Pixel 6 (oriole)
Pixel 6 Pro (raven)
android-gs-raviole-6.1-android16 android14-6.1

除了原廠支援的 Kernel 外,Pixel 6 和 6 Pro 裝置僅支援在「支援的 Pixel 6/6 Pro Android 平台和 Kernel 組合」表格中列出的 Android Common Kernel 分支版本,以進行 GKI 開發。由於 Android 平台 HAL 和 Pixel 核心驅動程式之間的供應商 UAPI 差異,下表提供支援的建構組合。

支援的 Pixel 6/6 Pro Android 平台和核心組合
Pixel 核心資訊清單分支 GKI 分支 Android 平台建構
gs-android-gs-raviole-mainline android-mainline android-latest-release
android16-6.12-gs101 android16-6.12 android-latest-release
gs-android13-gs-raviole-5.15 android13-5.15 TQ1A.230205.002 (9471150)

完成 Pixel 裝置準備

下圖說明在 Pixel 6 和後續機型上更新核心的程序:

**圖 1。** 核心更新流程圖

使用 flash.android.com 刷新裝置

  1. 前往 flash.android.com
  2. 根據支援的 Android 平台和核心組合,挑選 Android 版本。
  3. 選取下列選項:
    • 抹除裝置資料
    • 強制刷寫所有分區
    • 停用驗證功能
  4. 按下「Install build」按鈕,即可刷新裝置。

**圖 2。** 充電站範例

下載並編譯核心

同步處理核心存放區

執行下列指令,下載核心原始碼。請參閱「支援的 Pixel 6/6 Pro Android 平台和核心組合」表格,瞭解 Pixel KERNEL_MANIFEST_BRANCH

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

更新供應商 RAM 磁碟

更新核心存放區中的 vendor_ramdisk-DEVICE.img 檔案,使其與裝置上刷入的 Android 平台建構版本相符。您可以透過幾種方式更新 vendor_ramdisk-DEVICE.img 檔案。如果使用 Android 15 QPR2 (BP11.241025.006) 以上版本,請使用選項 (1)。否則,請使用選項 (2)。

  • 選項 1) 只更新 vendor_boot 分區的 DTB 和 DLKM ramdisk 位元

    從 fastboot 版本 35.0.2-12583183 開始,您可以直接在 vendor_boot 分割區上刷入 DTB 和 DLKM ramdisk。從 v35.0.2-12583183 成品下載並解壓縮 sdk-repo-HOST_OS-platform-tools-12583183.zip,以便在主機環境中使用。

    按照操作說明在「Flash the kernel images」(刷入核心映像檔) 步驟中刷入 DTB 和 vendor_boot:dlkm

  • 選項 2) 從 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
      

編譯核心 (Kleaf)

在 Android 13 中,build.sh 指令碼已由名為 Kleaf 的新核心建構系統取代。如果裝置使用 android13-5.15 以上版本,核心應使用 Kleaf 建構。

為方便起見,您可以執行 KERNEL_REPO_ROOT 中的 build_DEVICE.sh 指令碼。在大多數情況下,DEVICE必須是代號,可以是單一裝置的代號,例如「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,從本機來源建構核心。根據預設,開發核心分支會直接建構核心來源。

如要進一步瞭解核心建構系統和如何自訂建構作業,請參閱「Kleaf - Building Android Kernels with Bazel」。

刷入核心映像檔

注意:如果尚未停用驗證,請先停用再刷入自訂核心。執行這項操作的指令如下:
fastboot oem disable-verification
警告:如果在平台建構版本上刷入自訂核心,且新核心的安全性修補程式等級 (SPL) 較低,您可能需要清除裝置資料。 這項程序會清除所有個人資料。請務必先備份資料,再清除資料。
fastboot -w

如要刷寫核心映像檔,請針對裝置列出的每個核心分割區執行 fastboot flash 指令。如果是動態分割區,您必須先重新啟動進入 fastbootd 模式,才能刷機。

裝置 核心分割區
Pixel 6 (oriole)
Pixel 6 Pro (raven)
Pixel 6a (bluejay)
boot
dtbo
vendor_boot 或 vendor_boot:dlkm
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 (dynamic partition)
system_dlkm (dynamic partition)

以下是 Pixel 6 的 android-mainline 刷機指令:

fastboot flash boot        out/slider/dist/boot.img
fastboot flash dtbo        out/slider/dist/dtbo.img
fastboot flash  --dtb out/slider/dist/dtb.img vendor_boot:dlkm out/slider/dist/initramfs.img
fastboot reboot fastboot
fastboot flash vendor_dlkm out/slider/dist/vendor_dlkm.img

如果是 Pixel 6/6 Pro/6a,且您已在「更新供應商 ramdisk」一節中更新 vendor_ramdisk,請改用下列指令更新 vendor_boot 分割區:

fastboot flash vendor_boot out/slider/dist/vendor_boot.img

核心映像檔位於 DIST_DIR

核心分支 DIST_DIR
5.10 版 out/mixed/dist
5.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 核心分支
裝置 Android 開放原始碼計畫樹狀結構中的二進位檔路徑 存放區分支版本
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