Bootloader是Android設(shè)備啟動的第一道“關(guān)卡”,負(fù)責(zé)初始化硬件、加載系統(tǒng)鏡像并完成內(nèi)核啟動的前置準(zhǔn)備。在基于U-Boot的Android設(shè)備中,android_bootloader.c是對接Android啟動邏輯的核心文件——它決定了設(shè)備是進(jìn)入正常系統(tǒng)、Recovery模式還是Fastboot模式,同時(shí)承擔(dān)了AVB(Android Verified Boot)驗(yàn)證、內(nèi)核加載、命令行參數(shù)組裝等關(guān)鍵工作。(這個(gè)啟動流程android和linux共用)
本文將從文件定位、核心函數(shù)、執(zhí)行流程三個(gè)維度,拆解這個(gè)文件的底層邏輯。
一、文件核心定位
android_bootloader.c是U-Boot中實(shí)現(xiàn)Android啟動流程的核心模塊,核心職責(zé)包括:
1.解析BCB(Bootloader Control Block)信息,決策設(shè)備啟動模式(正常/Recovery/Fastboot);
2.處理AVB驗(yàn)證邏輯,保障系統(tǒng)鏡像的完整性;
3.加載Android內(nèi)核/Recovery鏡像到指定內(nèi)存地址;
4.組裝內(nèi)核啟動參數(shù)(cmdline),傳遞系統(tǒng)啟動所需的關(guān)鍵信息;
5.處理DTBO(Device Tree Overlay)疊加,適配不同硬件配置;
6.對接Android A/B分區(qū)機(jī)制,支持槽位切換與驗(yàn)證。
該文件依賴android_bootloader_message.h(BCB結(jié)構(gòu)體定義)、android_avb(AVB驗(yàn)證)、bootm.h(內(nèi)核啟動)等核心頭文件,是Bootloader與Android系統(tǒng)之間的“橋梁”。
二、核心函數(shù)拆解
按功能模塊劃分,文件中的核心函數(shù)可分為6大類,以下是關(guān)鍵函數(shù)的細(xì)節(jié)解析:
1. BCB(啟動控制塊)操作模塊
BCB存儲在misc分區(qū),是Bootloader與Android系統(tǒng)交互啟動指令的核心載體,相關(guān)函數(shù)負(fù)責(zé)BCB的讀寫與解析。
(1)android_bootloader_message_load/write
?作用:從misc分區(qū)讀取/寫入BCB結(jié)構(gòu)體(android_bootloader_message);
?關(guān)鍵邏輯:
?計(jì)算BCB所需的扇區(qū)數(shù),檢查misc分區(qū)大小是否足夠;
?調(diào)用blk_dread/blk_dwrite完成分區(qū)讀寫;
?讀寫失敗時(shí)打印錯(cuò)誤日志,返回負(fù)值。
(2)android_bootloader_load_and_clear_mode
?作用:解析啟動模式,是整個(gè)文件的“決策中樞”;
?關(guān)鍵邏輯:
a.先檢查RAM中是否有Fastboot指令(如reboot-bootloader),有則直接返回BOOTLOADER模式;
b.加載misc分區(qū)的BCB,解析command字段:
bootonce-bootloader:單次進(jìn)入Bootloader,讀取后清空BCB;
boot-recovery/boot-fastboot:進(jìn)入Recovery模式;
無匹配指令:默認(rèn)NORMAL模式。
(3)android_bcb_write
?作用:向misc分區(qū)寫入啟動指令(如Recovery啟動命令);
?關(guān)鍵限制:指令長度不能超過32字節(jié),否則返回內(nèi)存錯(cuò)誤。
2. AVB驗(yàn)證模塊
AVB是Android的鏡像驗(yàn)證機(jī)制,保障系統(tǒng)鏡像未被篡改,相關(guān)函數(shù)處理驗(yàn)證流程與鏡像分發(fā)。
(1)android_slot_verify
?作用:核心AVB驗(yàn)證函數(shù),完成分區(qū)驗(yàn)證與狀態(tài)更新;
?關(guān)鍵邏輯:
a.檢測設(shè)備解鎖狀態(tài)(解鎖則跳過嚴(yán)格驗(yàn)證);
b.分配內(nèi)存緩沖區(qū),加載boot/vendor_boot/init_boot等分區(qū);
c.調(diào)用avb_slot_verify執(zhí)行哈希樹驗(yàn)證;
d.根據(jù)驗(yàn)證結(jié)果更新androidboot.verifiedbootstate(green/orange/yellow/red);
e.驗(yàn)證失敗時(shí)標(biāo)記當(dāng)前槽位為不可啟動。
(2)avb_image_distribute_prepare/finish
?作用:AVB驗(yàn)證前后的鏡像內(nèi)存管理;
?prepare:分配連續(xù)內(nèi)存緩沖區(qū),規(guī)劃boot/vendor_boot/init_boot的內(nèi)存布局;
?finish:將驗(yàn)證后的鏡像分發(fā)到指定內(nèi)存地址,修復(fù)v3+版本的boot.img頭部。
3.鏡像加載模塊
負(fù)責(zé)從指定分區(qū)加載Android鏡像到內(nèi)存,是內(nèi)核啟動的前置步驟。
(1)android_image_load_by_partname
?作用:根據(jù)分區(qū)名(如boot/recovery)加載鏡像到指定內(nèi)存;
?關(guān)鍵邏輯:
a.通過分區(qū)名獲取分區(qū)信息(起始扇區(qū)、大小);
b.調(diào)用android_image_load將鏡像加載到內(nèi)存,并返回加載后的地址。
(2)android_bootloader_boot_flow
?作用:整合所有啟動流程的“主函數(shù)”;
?核心流程:啟動模式檢測→ AVB驗(yàn)證→鏡像加載→命令行組裝→內(nèi)核啟動。
4.內(nèi)核啟動模塊
負(fù)責(zé)內(nèi)核啟動的最終執(zhí)行,包括內(nèi)存分配、參數(shù)傳遞。
android_bootloader_boot_kernel
?作用:啟動Android內(nèi)核;
?關(guān)鍵邏輯:
a.解析內(nèi)核壓縮類型(GZIP/LZ4/LZO等),計(jì)算解壓所需內(nèi)存;
b.分配解壓內(nèi)存,釋放壓縮鏡像占用的內(nèi)存;
c.組裝bootm參數(shù)(內(nèi)核地址、設(shè)備樹地址);
d.調(diào)用do_bootm_states執(zhí)行內(nèi)核啟動流程。
5.命令行組裝模塊
內(nèi)核啟動參數(shù)(cmdline)的核心組裝邏輯,決定系統(tǒng)啟動的行為。
android_assemble_cmdline
?作用:整合多源參數(shù),生成最終的內(nèi)核cmdline;
?整合內(nèi)容:
a.環(huán)境變量中的bootargs基礎(chǔ)參數(shù);
b.A/B分區(qū)的槽位后綴(如androidboot.slot_suffix=_a);
c.設(shè)備序列號(androidboot.serialno=xxx);
d.根設(shè)備信息(root=/dev/xxx);
e.啟動模式參數(shù)(如skip_initramfs/androidboot.force_normal_boot=1)。
6. DTBO疊加模塊
適配不同硬件配置的設(shè)備樹疊加邏輯。
android_fdt_overlay_apply
?作用:加載DTBO分區(qū),將設(shè)備樹疊加層應(yīng)用到主設(shè)備樹;
?關(guān)鍵邏輯:
a.根據(jù)啟動模式(正常/Recovery)選擇DTBO分區(qū);
b.讀取DTBO頭部,選擇匹配的設(shè)備樹條目;
c.擴(kuò)容主設(shè)備樹內(nèi)存,應(yīng)用疊加層;
d.失敗時(shí)回滾主設(shè)備樹備份。
三、核心執(zhí)行流程(附流程圖)
android_bootloader.c的整體執(zhí)行流程可分為5個(gè)階段,以下是流程拆解與可視化流程圖:
1.流程總覽

2.流程分步解析
階段1:啟動模式檢測(核心是BCB解析)
Bootloader啟動后,首先讀取misc分區(qū)的BCB結(jié)構(gòu)體,同時(shí)檢查RAM中是否有Fastboot遺留指令(如reboot-bootloader)。根據(jù)BCB的command字段,決策設(shè)備進(jìn)入NORMAL(正常)、RECOVERY(恢復(fù))或BOOTLOADER(Fastboot)模式。
階段2:AVB驗(yàn)證(可選)
?若設(shè)備鎖定且啟用AVB,執(zhí)行分區(qū)驗(yàn)證:分配連續(xù)內(nèi)存緩沖區(qū),加載boot/vendor_boot/init_boot等分區(qū),通過AVB哈希樹驗(yàn)證鏡像完整性;
?若設(shè)備解鎖,跳過嚴(yán)格驗(yàn)證,僅標(biāo)記驗(yàn)證狀態(tài)為orange(未驗(yàn)證);
?驗(yàn)證完成后,將鏡像分發(fā)到內(nèi)核啟動所需的內(nèi)存地址。
階段3:鏡像加載
根據(jù)啟動模式選擇對應(yīng)的分區(qū)(正常模式選boot,Recovery模式選recovery/boot),調(diào)用android_image_load將鏡像加載到指定內(nèi)存地址。
階段4:命令行組裝
整合環(huán)境變量、A/B槽位、序列號、啟動模式參數(shù)等,生成最終的內(nèi)核cmdline,并更新bootargs環(huán)境變量(如添加androidboot.slot_suffix=_a、skip_initramfs等)。
階段5:內(nèi)核啟動
?適配DTBO疊加層(若有),擴(kuò)容主設(shè)備樹并應(yīng)用疊加;
?根據(jù)內(nèi)核壓縮類型分配解壓內(nèi)存,釋放壓縮鏡像內(nèi)存;
?調(diào)用do_bootm_states執(zhí)行內(nèi)核啟動流程,完成Bootloader到Android內(nèi)核的交接。
四、核心亮點(diǎn)與設(shè)計(jì)思路
1.靈活性適配:支持A/B分區(qū)、AVB驗(yàn)證、DTBO疊加等Android核心特性,兼容不同版本的Android啟動邏輯;
2.容錯(cuò)機(jī)制:BCB讀取失敗時(shí)默認(rèn)進(jìn)入正常模式,AVB驗(yàn)證失敗時(shí)標(biāo)記槽位為不可啟動,保障設(shè)備基礎(chǔ)可用性;
3.內(nèi)存高效管理:AVB驗(yàn)證時(shí)分配連續(xù)內(nèi)存緩沖區(qū),統(tǒng)一管理boot/vendor_boot/init_boot的內(nèi)存布局,避免內(nèi)存碎片;
4.啟動模式兼容:兼顧傳統(tǒng)Recovery分區(qū)與A/B分區(qū)的Recovery邏輯(無Recovery分區(qū)時(shí)復(fù)用boot分區(qū))。
五、總結(jié)
android_bootloader.c是U-Boot對接Android啟動邏輯的“核心樞紐”——它上承Bootloader的硬件初始化,下啟Android內(nèi)核的啟動流程,同時(shí)兼顧了安全性(AVB)、靈活性(A/B分區(qū))和兼容性(DTBO)。
理解這個(gè)文件的邏輯,不僅能掌握Android/linux設(shè)備的啟動流程,更能為定制化Bootloader、排查啟動故障(如Recovery無法進(jìn)入、AVB驗(yàn)證失敗)提供核心思路。對于Android底層開發(fā)、設(shè)備調(diào)試人員來說,這個(gè)文件是必須深入理解的核心模塊。
審核編輯 黃宇
-
Android
+關(guān)注
關(guān)注
12文章
4024瀏覽量
133973 -
u-boot
+關(guān)注
關(guān)注
0文章
135瀏覽量
39747 -
bootloader
+關(guān)注
關(guān)注
2文章
244瀏覽量
48029
發(fā)布評論請先 登錄
RK3576 Android15音頻開發(fā)必看:alsa_route核心文件解析與修改場景
深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯
RK平臺Android設(shè)備OTA升級教程:從原理到U盤實(shí)操
RK3576平臺Android HAL層故障排查:從lshal命令看透問題本質(zhì)
技術(shù)分享 | RK3568 Android11 如何實(shí)現(xiàn)自啟動應(yīng)用
深入解析RK平臺編譯核心:build.sh的知識點(diǎn)、調(diào)試技巧與開發(fā)價(jià)值
MTK平臺LK階段mt_boot.c配置:SELINUX_STATUS 2的作用與影響
硬核進(jìn)階:RK3576 Android15?驅(qū)動與系統(tǒng)開發(fā)實(shí)戰(zhàn)指南
深入解析rk平臺Android Bootloader核心代碼:從啟動流程到AVB驗(yàn)證
Bootloader固件升級的步驟
如何基于開發(fā)板RK3568 Android 11強(qiáng)制所有應(yīng)用橫屏展示
RK3576 Android 14.0 SDK開發(fā)指南(第一集)
3種系統(tǒng)加持!飛凌嵌入式RK3576核心板Linux、Android、桌面系統(tǒng)全兼容
為什么無法加載統(tǒng)一bootloader demo V2.1?
自定義RISC V的bootloader-v3
深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c
評論