本頁詳細介紹了為Android設備構建自定義內核的過程。以下說明將指導您完成選擇正確的源,構建內核並將結果嵌入到由Android Open Source Project(AOSP)構建的系統映像的過程。
可以使用Repo來獲取最新的內核源代碼,並且可以通過從源代碼檢出的根目錄運行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樹中的二進制路徑 | 回購分行 |
---|---|---|
像素5(redfin) | 設備/谷歌/ redfin內核 | android-msm-redfin-4.19-android11-d1 |
像素4a(5G)(荊棘) | 裝置/ google / bramble-kernel | android-msm-bramble-4.19-android11-d1 |
像素4a(翻車魚) | 設備/谷歌/ sunfish內核 | android-msm-sunfish-4.14-android11 |
像素4(火焰) 像素4 XL(珊瑚色) | 設備/谷歌/珊瑚內核 | android-msm-coral-4.14-android11 |
像素3a(sargo) 像素3a XL(bon魚) | 設備/谷歌/ bonito內核 | android-msm-bonito-4.9-android11 |
像素3(藍線) Pixel 3 XL(交叉影線) | 設備/谷歌/ crosshatch內核 | android-msm-crosshatch-4.9-android11 |
像素2(大眼) Pixel 2 XL(台灣) | 設備/谷歌/ wahoo內核 | android-msm-wahoo-4.4-android10-qpr3 |
像素(旗魚) 像素XL(馬林) | 設備/谷歌/馬林內核 | android-msm-marlin-3.18-pie-qpr2 |
Hikey960 | 設備/ linaro / hikey內核 | 遠足-linaro-android-4.14 遠足-linaro-android-4.19 常見的android12-5.4 |
小獵犬x15 | 設備/ ti / beagle_x15內核 | omap-beagle-x15-android-4.14 omap-beagle-x15-android-4.19 |
Android通用內核 | 不適用 | 常見的Android 4.4 常見的Android-4.9 常見的Android-4.14 常見的Android-4.19 常見的Android-4.19穩定 常見的android11-5.4 常見的android12-5.4 常見的android12-5.10 通用Android主線 |
構建內核
然後使用以下命令構建內核:
build/build.sh
內核二進製文件,模塊和相應的映像位於out/ BRANCH /dist
目錄中。
構建GKI模塊
Android 11引入了GKI ,它將內核分為Google維護的內核映像和供應商維護的模塊,它們分別構建。
內核映像配置的示例:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
模塊配置示例(墨魚):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
運行內核
運行定制內核的方法有多種。以下是適用於各種開發方案的已知方法。
嵌入到Android映像構建中
將Image.lz4-dtb
複製到AOSP樹中的相應內核二進制位置,然後重建啟動映像。
或者,在使用make bootimage
(或構建引導映像的任何其他make
命令行)時定義TARGET_PREBUILT_KERNEL
變量。該變量受所有設備支持,因為它是通過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 |
OUT_DIR | 內核構建的基本輸出目錄。 | OUT_DIR=/path/to/my/out |
DIST_DIR | 內核分發的基本輸出目錄。 | OUT_DIR=/path/to/my/dist |
CC | 覆蓋要使用的編譯器。退回到build.config 定義的默認編譯器。 | CC=clang |
SKIP_MRPROPER | 跳過make mrproper | SKIP_MRPROPER=1 |
SKIP_DEFCONFIG | 跳過make defconfig | SKIP_DEFCONFIG=1 |
用於本地構建的自定義內核配置
如果您需要定期切換內核配置選項(例如,在使用某個功能時),或者需要出於開發目的而設置選項,則可以通過維護本地修改或構建配置副本來實現這種靈活性。
將變量POST_DEFCONFIG_CMDS設置為在通常的make defconfig
步驟完成後立即求值的語句。由於將build.config
文件引入到構建環境中, build.config
可以將build.config
定義的功能稱為post-defconfig命令的一部分。
一個常見的示例是在開發過程中禁用交叉影線內核的鏈接時間優化(LTO)。雖然LTO對於已發布的內核很有用,但構建時的開銷可能會很大。使用build/build.sh
時,以下添加到本地build.config
代碼段將build.config
禁用LTO。
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樹包含預構建的內核版本。大多數情況下,git日誌會在提交消息中顯示正確的版本:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
系統映像的內核版本
要確定係統映像中使用的內核版本,請對內核文件運行以下命令:
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 out/ramdisk gki-ramdisk.lz4
如果您使用AOSP master開發,則可以從ci.android.com上的aosp_arm64構建中下載ramdisk-recovery.img
構建工件,並將其用作您的Ramdisk二進製文件。
當您擁有一個ramdisk二進製文件並將其複製到內核構建的根目錄中的gki-ramdisk.lz4
時,可以通過執行以下命令來生成引導映像:
BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image.gz GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
引導映像位於out/<kernel branch>/dist/boot.img
。