建構 Pixel 核心

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

GKI 支援的 Pixel 核心分支
裝置 Android 開放原始碼計畫樹狀結構中的二進位檔路徑 存放區分支 GKI 核心
Pixel 9 Pro Fold (comet) 裝置/google/comet-kernel android-gs-comet-6.1-android14-qpr3-d1 android14-6.1
Pixel 9 (Tokay)
Pixel 9 Pro (Caiman)
Pixel 9 Pro XL (科莫多)
裝置/google/caimito-kernel android-gs-caimito-6.1-android14-qpr3-d1 android14-6.1
Pixel 8a (akita) 裝置/google/akita-kernel android-gs-akita-5.15-android14-qpr3 Android14-5.15
Pixel 8 (護盾)
Pixel 8 Pro (哈士奇)
裝置/google/shusky-kernel android-gs-shusky-5.15-android14-qpr3 android14-5.15
Pixel Fold (felix) device/google/felix-kernel android-gs-felix-5.10-android14-qpr3 android13-5.10
Pixel Tablet (tangorpro) 裝置/google/tangorpro-kernel android-gs-tangorpro-5.10-android14-qpr3 android13-5.10
Pixel 7a (Lynx) 裝置/google/lynx-kernel android-gs-lynx-5.10-android14-qpr3 android13-5.10
Pixel 7 (panther)
Pixel 7 Pro (cheetah)
裝置/google/pantah-kernel android-gs-pantah-5.10-android14-qpr3 android13-5.10
Pixel 6a (bluejay) device/google/bluejay-kernel android-gs-bluejay-5.10-android14-qpr3 android13-5.10
Pixel 6 (或圓形)
Pixel 6 Pro (渡鴉)
裝置/google/raviole-kernel android-gs-raviole-5.10-android14-qpr3 android13-5.10

除了工廠支援的核心外,Pixel 6 和 6 Pro 裝置僅支援在「支援的 Pixel 6/6 Pro Android 平台和核心組合」表格中列出的 Android 通用核心分支進行 GKI 開發。由於 Android 平台 HAL 和 Pixel 核心驅動程式之間的供應商 UAPI 不同,因此表格會提供支援的建構組合。

支援的 Pixel 6/6 Pro Android 平台和核心組合
Pixel 核心資訊清單分支 GKI 分支 Android 平台版本 aosp-main 支援服務?
gs-android-gs-raviole-mainline android-mainline (6.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 和後續機型上更新核心的程序:

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

使用 flash.android.com 刷新裝置

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

**圖 2.** Flash Station 範例

下載並編譯核心

同步處理核心存放區

執行下列指令下載核心原始碼。請參閱 Pixel KERNEL_MANIFEST_BRANCH 的「支援的 Pixel 6/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 平台版本。您可以採取以下幾種做法。

選項 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 以取得供應商 RAM 磁碟。

      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 (或圓形)
    Pixel 6 Pro (渡鴉)
    prebuilds/boot-artifacts/ramdisks/vendor_ramdisk-oriole.img
    Pixel 6a (藍鳥) 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 (或圓形)
Pixel 6 Pro (渡鴉)
prebuilds/boot-artifacts/ramdisks/vendor_ramdisk-oriole.img
Pixel 6a (藍鳥) 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 和 6 Pro,請執行 Kleaf 建構指令:

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

如果是搭載 android13-5.15 核心的 Pixel 6 和 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,以便從本機來源建構核心。

如要進一步瞭解核心建構系統以及如何自訂建構,請參閱 Kleaf - 使用 Bazel 建構 Android 核心一文。

刷新核心映像檔

注意:如果尚未停用驗證功能,就必須先停用驗證功能,才能刷新自訂核心。操作指令如下:
fastboot oem disable-verification
警告:如果您在平台版本上刷新自訂核心,如果有與新核心相關的安全性修補程式等級 (SPL) 降級,則可能需要清除裝置資料。 這麼做會清除所有個人資料。請務必先備份資料,再抹除資料。
fastboot -w

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

裝置 核心劃分
Pixel 6 (或奧爾文)
Pixel 6 Pro (raven)
Pixel 6a (bluejay)
boot
dtbo
vendor_boot
vendor_dlkm (動態分割區)
Pixel 8 (shiba)
Pixel 8 Pro (哈士奇)
Pixel Fold (felix)
Pixel 平板電腦 (tangorpro)
Pixel 7a (lynx)
Pixel 7 (平移)
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
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 和更早推出的裝置的核心存放區分支版本。這些是 Google 鍵盤不支援的裝置。

舊版 Pixel 核心分支
裝置 Android 開放原始碼計畫樹狀結構中的二進位檔路徑 存放區分支
Pixel 5a (條碼)
Pixel 4a (5G) (巴西)
Pixel 5 (紅榴色)
裝置/google/redbull-kernel android-msm-redbull-4.19-android14-qpr3
Pixel 4a (sunfish) 裝置/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr3
Pixel 4 (火焰)
Pixel 4 XL (珊瑚色)
裝置/google/coral-kernel android-msm-coral-4.14-android13
Pixel 3a (沙龍)
Pixel 3a XL (Bonito)
裝置/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (藍線)
Pixel 3 XL (交叉陰影)
裝置/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2 (walleye)
Pixel 2 XL (taimen)
裝置/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Pixel (帆船)
Pixel XL (馬林魚)
裝置/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2