按官方流程下載、編譯 Android 內核(Nexus 5 / msm 平台),編譯無錯誤。配置 TARGET_PREBUILT_KERNEL 變量指向 zImage,執行 make bootimage 打包刷入真機,手機無法啟動。疑似 zImage 未被正確打包進 boot.img。
Nexus 5 (hammerhead) 採用 Device Tree Blob (DTB) 附加模式,內核映像必須包含設備樹二進制數據。編譯系統生成的真正可啟動映像是 zImage-dtb(即 zImage + dtb 拼接),而非單獨的 zImage。
修改編譯配置,指向正確的內核映像文件:
# 錯誤配置
TARGET_PREBUILT_KERNEL := $(KERNEL_OUT)/arch/arm/boot/zImage
# 正確配置(Nexus 5 專用)
TARGET_PREBUILT_KERNEL := $(KERNEL_OUT)/arch/arm/boot/zImage-dtb
重新執行 make bootimage 即可生成可啟動的 boot.img。
zImage + dtb,Bootloader 解析時自動分離。zImage + 獨立 dtb 分區。$(KERNEL_OUT)/arch/arm/boot/ 目錄下是否存在 zImage-dtb。boot.img(用 unpackbootimg 工具)確認內核載荷大小與 zImage-dtb 一致。fastboot flash boot boot.img 觀察啟動日誌(adb logcat / dmesg)。BoardConfig.mk 確認 TARGET_PREBUILT_KERNEL 應指向的文件名。TARGET_KERNEL_SOURCE 等變量,構建系統會自動處理 DTB 拼接。boot.img,以便回滾。一行配置錯誤導致無法啟動,凸顯了理解 Android 啟動流程與設備樹機制的重要性。