建構核心

本頁詳述建構自訂流程的程序 核心。這些 指示逐步完成選取 將結果嵌入系統映像檔 。

如要取得較新的核心來源,請使用 存放區;不必進一步建構 從根目錄的根層級執行 build/build.sh 來源結帳。

下載原始碼及建構工具

如果是最近的核心,請使用 repo 下載來源、工具鍊和建構指令碼。 部分核心 (例如 Pixel 3 核心) 需要多個 Git 的來源 但其他 (例如一般核心) 只需要一個 來源。使用 repo 方法可確保正確的來源 目錄設定。

下載適當分支版本的來源:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

取得可與先前版本搭配使用的存放區分支版本 (BRANCH) 清單 「repo init」指令 核心分支版本及其建構系統

如要進一步瞭解如何下載及編譯 Pixel 裝置核心,請參閱 建構 Pixel 核心

建構核心

使用 Bazel (Kleaf) 進行建構

Android 13 推出了 Bazel

如要為 aarch64 架構建構 GKI 核心,請前往 Android 通用核心分支版本不低於 Android 13 然後執行下列指令:

tools/bazel build //common:kernel_aarch64_dist

如要建立發布版,請執行:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

而核心二進位檔、模組和對應映像檔則位於 $DIST_DIR 目錄內。如未指定 --dist_dir,請查看輸出內容 擷取構件的位置詳情請參閱 Android 開放原始碼計畫說明文件

使用 build.sh 建構 (舊版)

如果是 Android 12 以下版本的分支版本,或 沒有 Kleaf 的分支版本:

build/build.sh

核心二進位檔、模組和對應的映像檔位於 out/BRANCH/dist 目錄內。

建構虛擬裝置的供應商模組

Android 13 推出了 Bazel (Kleaf),取代 build.sh

如要建構 virtual_device 的模組,請執行:

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

如要建立發布版,請執行:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

如要進一步瞭解如何使用 Bazel 建構 Android 核心,請參閱。 Kleaf - 使用 Bazel 建構 Android 核心

如要進一步瞭解個別架構的 Kleaf 支援,請參閱 裝置和核心的 Kleaf 支援

使用 build.sh (舊版) 為虛擬裝置建構供應商模組

在 Android 12 Cuttlefish 和 Goldfish 收縮中,因此兩者共享 相同的核心:virtual_device。如要建構該核心的模組,請使用此版本 設定:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

Android 11 推出 GKI、 將核心分割為 Google 維護的核心映像檔和廠商維護的模組; 這些元件是單獨建構的

以下範例顯示核心映像檔設定:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

以下範例顯示模組設定 (Cuttlefish 和 Emulator):

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

執行核心

您可以透過多種方式執行自訂核心。以下是 瞭解適合各種開發情境的已知方式

嵌入 Android 映像檔版本

Image.lz4-dtb 複製到對應的核心二進位檔位置 ,然後重新建構開機映像檔。

或者,您也可以定義 TARGET_PREBUILT_KERNEL 變數也會隨著使用 make bootimage (或任何其他類型) make 指令列)。這個變數是 支援的所有裝置都支援這項設定 device/common/populate-new-device.sh。例如:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

使用 Fastboot 刷新和啟動核心

大多數新型裝置都有系統啟動載入程式擴充功能,簡化 產生及啟動開機映像檔

如何在不刷新的情況下啟動核心:

adb reboot bootloader
fastboot boot Image.lz4-dtb

使用這個方法時,核心並未實際刷新,因此不會持續 就會發生這類情形

在 Cuttlefish 執行核心

您可以在您選擇的架構中執行核心 Cuttlefish 裝置

使用一組特定核心啟動 Cuttlefish 裝置 構件執行 cvd start 指令,其中含有目標核心構件,做為 參數。以下範例指令會從 common-android14-6.1 核心資訊清單。

cvd start \
    -kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \
    -initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img

若需更多資訊,請參閲 在 Cuttlefish 開發核心

自訂核心版本

如要自訂 Kleaf 版本的核心版本,請參閱 Kleaf 說明文件

使用 build.sh 自訂核心版本 (舊版)

build/build.sh 的建構程序和結果可能會受到影響 以環境變數為單位 大部分皆為選用項目,每個核心分支版本應有適當的 預設設定。下方列出最常用的參數。換 完整 (且最新) 清單請參閱 build/build.sh

環境變數 說明 範例
BUILD_CONFIG 從初始化建構環境的位置建構設定檔。 必須依據存放區根目錄定義位置 目錄。預設值為 build.config
一般核心必須採用這個原則。
BUILD_CONFIG=common/build.config.gki.aarch64
CC 覆寫要使用的編譯器。恢復預設值 build.config 定義的編譯器。 CC=clang
DIST_DIR 核心發布的基礎輸出目錄。 DIST_DIR=/path/to/my/dist
OUT_DIR 核心版本的基礎輸出目錄。 OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG 略過 make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER 略過 make mrproper SKIP_MRPROPER=1

本機建構作業的自訂核心設定

在 Android 14 以上版本中,您可以使用 defconfig 片段 自訂核心設定看 定義片段的 Kleaf 說明文件

具有建構設定的本機建構作業自訂核心設定 (舊版)

如果是 Android 13 以下版本,請參閱以下說明。

舉例來說,如果您需要定期切換核心設定選項,例如 或者您需要在開發功能時 能讓您擁有一組本機環境 修改或複製建構設定

POST_DEFCONFIG_CMDS 變數設為符合以下條件的陳述式: 經過一般的 make defconfig 步驟後 完成。由於 build.config 檔案會擷取至建構作業中 環境,則可呼叫 build.config 中定義的函式 作為定義後指令的一部分

常見的例子是為 Crosshatch 停用連結時間最佳化 (LTO) 功能 核心差異。雖然 LTO 對發布核心有益, 可能會相當可觀新增了下列程式碼片段 本機 build.config 會在 使用 build/build.sh

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

找出核心版本

您可以透過 Android 開放原始碼計畫樹狀結構,從下列兩個來源找出要建構的正確版本。 以及系統映像檔

Android 開放原始碼計畫樹狀結構的核心版本

AOSP 樹狀結構包含預先建構的核心版本。Git log 會在修訂訊息中顯示正確的版本:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

如果 Git 記錄檔中沒有核心版本,請從系統取得。

系統映像檔的核心版本

如要判斷系統映像檔使用的核心版本,請執行下列指令 呼叫核心檔案的指令:

file kernel

如果是 Image.lz4-dtb 檔案,請執行:

grep -a 'Linux version' Image.lz4-dtb

建立開機映像檔

您可以使用核心建構環境建構開機映像檔。

使用 init_boot 建立裝置的開機映像檔

如果裝置搭載 init_boot 分區, 開機映像檔會與核心一併建構未嵌入 initramfs 圖片 複製到開機映像檔中

例如,使用 Kleaf 時,您可以使用以下指令建構 GKI 開機映像檔:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

使用 build/build.sh (舊版) 時,您可以使用以下指令建構 GKI 開機映像檔:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

GKI 開機映像檔位於 $DIST_DIR

為沒有 init_boot 的裝置建構開機映像檔 (舊版)

如果裝置沒有 init_boot 分區, 您需要 ramdisk 二進位檔,方法是透過 下載 GKI 開機映像檔 拆解工具您可以使用任何來自相關 Android 版本的 GKI 啟動映像檔。

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

目標資料夾是核心樹狀結構的頂層目錄 (目前 工作目錄)。

如果您使用 Android 開放原始碼計畫主應用程式進行開發,可以改為下載 ramdisk-recovery.img 個版本構件 (來自 aosp_arm64 版本) ci.android.com,並以此做為 ramdisk 二進位檔。

如果有 ramdisk 二進位檔,並將其複製到根層級的 gki-ramdisk.lz4 中 核心版本的目錄,您可以執行以下指令產生開機映像檔:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

如果您使用的是 x86 架構,請替換 Image 主講者:bzImageaarch64x86_64:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

這個檔案位於構件目錄中 $KERNEL_ROOT/out/$KERNEL_VERSION/dist

開機映像檔位於 out/<kernel branch>/dist/boot.img