構建內核

此頁面詳細構建自定義的過程內核為Android設備。這些說明將指導您完成選擇正確源、構建內核以及將結果嵌入到從 Android 開源項目 (AOSP) 構建的系統映像中的過程。

您可以獲取使用較新的內核源代碼回購;通過運行建立他們無需再另行配置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通過此方法可用的內核名稱。

設備AOSP 樹中的二進制路徑回購分支
Pixel 5a(巴貝特)設備/谷歌/barbet-內核android-msm-barbet-4.19-android12
像素 5(紅鰭)
Pixel 4a (5G)(荊棘)
設備/谷歌/紅牛內核android-msm-redbull-4.19-android12
Pixel 4a(翻車魚)設備/谷歌/太陽魚內核android-msm-sunfish-4.14-android12
像素 4(火焰)
Pixel 4 XL(珊瑚色)
設備/谷歌/珊瑚內核android-msm-coral-4.14-android12
像素 3a (sargo)
Pixel 3a XL(鰹魚)
設備/谷歌/bonito-內核android-msm-bonito-4.9-android12
像素 3(藍線)
Pixel 3 XL(剖麵線)
設備/谷歌/crosshatch-內核android-msm-crosshatch-4.9-android12
像素 2(角膜白斑)
Pixel 2 XL(泰門)
設備/谷歌/wahoo-內核android-msm-wahoo-4.4-android10-qpr3
像素(旗魚)
像素 XL(馬林魚)
設備/谷歌/馬林魚內核android-msm-marlin-3.18-pie-qpr2
Hikey960設備/linaro/hikey-kernel hipy-linaro-android-4.14
hipy-linaro-android-4.19
common-android12-5.4
比格犬 x15設備/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Android 通用內核不適用common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-stable
common-android11-5.4
common-android12-5.4
common-android12-5.10
通用安卓主線

構建內核

然後用這個構建內核:

build/build.sh

內核二進制,模塊,以及對應的圖像位於out/ BRANCH /dist目錄。

構建 GKI 模塊

機器人11導入GKI ,其內核分離成谷歌維護內核圖像和供應商保持模塊,其被單獨構建。

此示例顯示內核映像配置:

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中12墨魚和金魚收斂,所以它們共享相同的內核: virtual_device 。要構建該內核的模塊,請使用以下構建配置:

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

運行內核

有多種方法可以運行定制的內核。以下是適用於各種開發場景的已知方式。

嵌入到 Android 鏡像構建中

複製Image.lz4-dtb到AOSP樹中的各個內核二進制文件的位置和重建引導映像。

可替代地,定義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

使用這種方法,內核實際上不會被刷新,並且不會在重新啟動後持續存在。

自定義內核構建

構建過程和結果可能會受到環境變量的影響。它們中的大多數是可選的,每個內核分支都應該帶有適當的默認配置。這裡列出了最常用的。對於一個完整的(和及時更新)列表,請參閱build/build.sh

環境變量描述例子
BUILD_CONFIG從您初始化構建環境的位置構建配置文件。該位置必須相對於 Repo 根目錄定義。默認為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

本地構建的自定義內核配置

如果您需要定期切換內核配置選項,例如,在處理某個功能時,或者如果您需要為開發目的設置一個選項,您可以通過維護構建配置的本地修改或副本來實現這種靈活性。

設置變量POST_DEFCONFIG_CMDS到被評估的常規的後右聲明make defconfig一步完成。由於build.config文件來源的編譯環境,在定義的函數build.config可稱為後defconfig命令的一部分。

一個常見的例子是在開發過程中禁用交叉線內核的鏈接時間優化 (LTO)。雖然 LTO 有利於已發布的內核,但構建時的開銷可能很大。添加到本地下面的代碼片斷build.config使用時禁用LTO持續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)
}

識別內核版本

您可以從兩個來源確定要構建的正確版本:AOSP 樹和系統映像。

來自 AOSP 樹的內核版本

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

構建啟動映像

可以使用內核構建環境構建引導映像。為此,您需要一個 ramdisk 二進製文件,您可以通過下載 GKI 啟動映像並解壓縮它來獲得它。來自相關 Android 版本的任何 GKI 啟動映像都可以使用。

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

目標文件夾是內核樹的頂級目錄(當前工作目錄)。

如果您與AOSP高手開發,可以改為下載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架構的工作,更換ImagebzImage ,並aarch64x86_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