作為Android設(shè)備啟動(dòng)的第一道“閘門(mén)”,Bootloader(以U-Boot為主)承擔(dān)著初始化硬件、加載內(nèi)核、驗(yàn)證鏡像完整性的核心職責(zé)。今天我們拆解Rockchip平臺(tái)下android_bootloader.c的核心代碼,帶你讀懂Android設(shè)備從Bootloader到內(nèi)核的完整啟動(dòng)邏輯,以及開(kāi)發(fā)者關(guān)注這些代碼的核心價(jià)值。
一、代碼整體定位
這份代碼是Rockchip(瑞芯微)平臺(tái)U-Boot中Android Bootloader的核心實(shí)現(xiàn),核心作用是銜接硬件初始化與內(nèi)核啟動(dòng),主要負(fù)責(zé):
?讀寫(xiě)B(tài)ootloader控制塊(BCB),判斷設(shè)備啟動(dòng)模式(正常/Recovery/Bootloader);
?執(zhí)行Android Verified Boot(AVB)驗(yàn)證,保障鏡像完整性;
?加載內(nèi)核/設(shè)備樹(shù)鏡像,組裝內(nèi)核命令行,最終啟動(dòng)內(nèi)核;
?適配A/B分區(qū)、DTBO疊加層等Android特性。
二、核心函數(shù)解析:從啟動(dòng)模式判斷到內(nèi)核啟動(dòng)
我們按“啟動(dòng)流程鏈路”拆解關(guān)鍵函數(shù),理解每個(gè)環(huán)節(jié)的核心作用:
1. BCB讀寫(xiě):?jiǎn)?dòng)指令的“中轉(zhuǎn)站”
BCB(Bootloader Control Block)是存儲(chǔ)在misc分區(qū)的啟動(dòng)控制信息,決定設(shè)備下次啟動(dòng)的模式,核心操作由兩個(gè)函數(shù)完成:
android_bootloader_message_load
?作用:從misc分區(qū)讀取BCB數(shù)據(jù)到內(nèi)存;
?關(guān)鍵邏輯:檢查misc分區(qū)大小是否足夠容納BCB結(jié)構(gòu)體→調(diào)用blk_dread讀取指定扇區(qū)→失敗則輸出日志并返回錯(cuò)誤。
android_bootloader_message_write
?作用:將內(nèi)存中的BCB數(shù)據(jù)寫(xiě)入misc分區(qū);
?關(guān)鍵邏輯:與讀操作邏輯對(duì)稱(chēng),調(diào)用blk_dwrite寫(xiě)入→支持“一次性指令”(如bootonce-bootloader)的清空。
android_bcb_write
?作用:向BCB寫(xiě)入自定義啟動(dòng)命令(如boot-recovery);
?關(guān)鍵邏輯:初始化空BCB結(jié)構(gòu)體→查找misc分區(qū)→寫(xiě)入指定命令(如強(qiáng)制進(jìn)入Recovery)。
2.啟動(dòng)模式判斷:決定設(shè)備“走哪條路”
android_bootloader_load_and_clear_mode
?作用:核心啟動(dòng)模式?jīng)Q策函數(shù);
?關(guān)鍵邏輯:
a.先檢查Fastboot緩沖區(qū)(CONFIG_FASTBOOT_BUF_ADDR),若有reboot-bootloader指令,直接判定為Bootloader模式;
b.讀取BCB,匹配指令:
bootonce-bootloader:一次性進(jìn)入Bootloader,讀取后清空BCB;
boot-recovery/boot-fastboot:進(jìn)入Recovery模式;
無(wú)匹配指令:正常啟動(dòng)模式。
android_boot_mode_str
?作用:將枚舉類(lèi)型的啟動(dòng)模式(如ANDROID_BOOT_MODE_RECOVERY)轉(zhuǎn)換為字符串(如recovery),便于日志輸出和調(diào)試。
3. Bootloader模式:進(jìn)入Fastboot
android_bootloader_boot_bootloader
?作用:觸發(fā)Fastboot模式;
?關(guān)鍵邏輯:讀取環(huán)境變量fastbootcmd(無(wú)則用默認(rèn)值fastboot usb 0)→執(zhí)行該命令,讓設(shè)備進(jìn)入Fastboot刷機(jī)模式。
4.內(nèi)核加載與啟動(dòng):核心執(zhí)行環(huán)節(jié)
sysmem_alloc_uncomp_kernel
?作用:為解壓后的內(nèi)核分配內(nèi)存;
?關(guān)鍵邏輯:
a.根據(jù)內(nèi)核壓縮類(lèi)型(LZ4/GZIP/LZO等),按壓縮比反向計(jì)算解壓后大小(如GZIP按40%壓縮比,分配2.5倍原大小);
b.釋放壓縮內(nèi)核占用的內(nèi)存→分配解壓內(nèi)核所需內(nèi)存,避免內(nèi)存溢出。
android_bootloader_boot_kernel
?作用:最終啟動(dòng)內(nèi)核的“臨門(mén)一腳”;
?關(guān)鍵邏輯:
a.解析內(nèi)核地址、壓縮類(lèi)型(如LZ4),輸出啟動(dòng)日志;
b.調(diào)用sysmem_alloc_uncomp_kernel分配解壓內(nèi)存;
c.調(diào)用do_bootm_states執(zhí)行內(nèi)核啟動(dòng)流程(加載OS、初始化RAMDisk、執(zhí)行內(nèi)核)。
5.內(nèi)核命令行:給內(nèi)核的“啟動(dòng)參數(shù)”
strjoin
?作用:基礎(chǔ)工具函數(shù),將字符串?dāng)?shù)組用指定分隔符(如空格)拼接成完整字符串。
android_assemble_cmdline
?作用:組裝內(nèi)核啟動(dòng)命令行(bootargs);
?關(guān)鍵邏輯:拼接以下參數(shù),生成最終bootargs:
?環(huán)境變量默認(rèn)bootargs;
?A/B分區(qū)后綴(如androidboot.slot_suffix=_a);
?設(shè)備序列號(hào)(androidboot.serialno=xxx);
?Root設(shè)備路徑(root=/dev/xxx);
?額外參數(shù)(如Normal模式的skip_initramfs)。
6. AVB驗(yàn)證:?jiǎn)?dòng)安全性的“守門(mén)人”
AVB(Android Verified Boot)是Android的鏡像驗(yàn)證機(jī)制,防止惡意鏡像刷入,核心函數(shù)如下:
android_slot_verify
?作用:核心AVB驗(yàn)證函數(shù);
?關(guān)鍵邏輯:
a.檢查設(shè)備解鎖狀態(tài)(解鎖則跳過(guò)嚴(yán)格驗(yàn)證);
b.獲取A/B分區(qū)元數(shù)據(jù),確定當(dāng)前啟動(dòng)slot(_a/_b);
c.調(diào)用avb_slot_verify驗(yàn)證boot/recovery/vendor_boot等分區(qū)鏡像;
d.驗(yàn)證失敗則標(biāo)記該slot為不可啟動(dòng)→驗(yàn)證成功則分發(fā)鏡像到指定內(nèi)存地址。
slot_set_unbootable
?作用:將指定A/B分區(qū)標(biāo)記為“不可啟動(dòng)”;
?關(guān)鍵邏輯:清空分區(qū)優(yōu)先級(jí)、剩余嘗試次數(shù)、啟動(dòng)成功標(biāo)記,防止設(shè)備啟動(dòng)損壞的鏡像。
7.設(shè)備樹(shù)適配:硬件適配的“靈活層”
android_get_dtbo&android_fdt_overlay_apply
?作用:加載并應(yīng)用DTBO(設(shè)備樹(shù)疊加層);
?關(guān)鍵邏輯:
a.從dtbo/recovery分區(qū)讀取DTBO鏡像;
b.選擇指定索引的設(shè)備樹(shù)條目;
c.將DTBO疊加到主設(shè)備樹(shù)(適配不同硬件配置)→失敗則恢復(fù)原設(shè)備樹(shù)。
8.核心啟動(dòng)流程:android_bootloader_boot_flow
這是整個(gè)Bootloader啟動(dòng)的“總控函數(shù)”,串聯(lián)所有環(huán)節(jié):
1.讀取misc分區(qū),判斷啟動(dòng)模式(Normal/Recovery/Bootloader);
2.處理A/B分區(qū)slot后綴;
3.執(zhí)行AVB驗(yàn)證(若開(kāi)啟);
4.加載boot/recovery鏡像到指定內(nèi)存;
5.組裝內(nèi)核命令行;
6.加載DTBO并應(yīng)用疊加層;
7.調(diào)用android_bootloader_boot_kernel啟動(dòng)內(nèi)核。
三、核心啟動(dòng)流程圖

四、開(kāi)發(fā)者關(guān)注這部分代碼的核心意義
1.定制啟動(dòng)邏輯,適配產(chǎn)品需求
?可修改BCB指令邏輯,實(shí)現(xiàn)定制化啟動(dòng)(如強(qiáng)制進(jìn)入Recovery、修改Fastboot默認(rèn)命令);
?適配不同Android版本特性(如動(dòng)態(tài)分區(qū)下skip_initramfs替換為androidboot.force_normal_boot=1)。
2.保障啟動(dòng)安全性,合規(guī)Android規(guī)范
?AVB驗(yàn)證是Google Play認(rèn)證的核心要求,理解android_slot_verify等函數(shù),可確保鏡像驗(yàn)證邏輯符合Android安全規(guī)范;
?處理A/B分區(qū)元數(shù)據(jù),避免設(shè)備因鏡像損壞無(wú)法啟動(dòng)(標(biāo)記不可啟動(dòng)slot)。
3.快速定位啟動(dòng)故障
?啟動(dòng)失敗(如無(wú)法進(jìn)入Recovery、內(nèi)核崩潰)時(shí),可通過(guò)函數(shù)日志定位問(wèn)題:
?misc分區(qū)讀寫(xiě)失敗→檢查分區(qū)大小/扇區(qū)地址;
?AVB驗(yàn)證失敗→排查鏡像簽名/rollback索引;
?內(nèi)存分配失敗→調(diào)整內(nèi)核解壓內(nèi)存計(jì)算邏輯。
4.適配硬件與內(nèi)核,提升兼容性
?DTBO疊加層邏輯可適配同芯片不同硬件配置(如不同屏幕/傳感器);
?內(nèi)核壓縮格式適配(LZ4/GZIP等),優(yōu)化啟動(dòng)速度(代碼中已標(biāo)注RK3308不同壓縮格式的啟動(dòng)耗時(shí),LZ4最優(yōu))。
5.定制內(nèi)存布局,優(yōu)化啟動(dòng)性能
?sysmem_alloc_uncomp_kernel函數(shù)決定內(nèi)核解壓內(nèi)存的分配策略,合理調(diào)整壓縮比計(jì)算邏輯,可避免內(nèi)存溢出,同時(shí)優(yōu)化啟動(dòng)速度。
五、總結(jié)
android_bootloader.c是Rockchip平臺(tái)Android Bootloader的“心臟”,串聯(lián)了啟動(dòng)模式判斷、安全驗(yàn)證、鏡像加載、內(nèi)核啟動(dòng)全鏈路。對(duì)于開(kāi)發(fā)者而言:
?理解它,能定制符合產(chǎn)品需求的啟動(dòng)邏輯;
?掌握它,能快速定位啟動(dòng)故障,保障設(shè)備穩(wěn)定性;
?吃透它,能適配Android安全規(guī)范,兼顧功能性與安全性。
無(wú)論是做Android底層定制、設(shè)備刷機(jī)工具開(kāi)發(fā),還是解決Bootloader啟動(dòng)問(wèn)題,這份代碼都是繞不開(kāi)的核心——它不僅是代碼,更是Android設(shè)備從“硬件初始化”到“系統(tǒng)啟動(dòng)”的完整邏輯閉環(huán)。
審核編輯 黃宇
-
Android
+關(guān)注
關(guān)注
12文章
4035瀏覽量
134364 -
AVB
+關(guān)注
關(guān)注
0文章
16瀏覽量
5697
發(fā)布評(píng)論請(qǐng)先 登錄
深度解析?| DMA-BUF適配Android與RK特性核心Patch:高性能內(nèi)存管理升級(jí)方案
基于瑞芯微平臺(tái)的 eMMC 顆粒驗(yàn)證全流程指南
深入解析U-Boot image.c:RK平臺(tái)鏡像處理核心邏輯
一文吃透RK平臺(tái)OTA升級(jí)開(kāi)發(fā):從邏輯到調(diào)試的完整指南
技術(shù)分享 | RK3568 Android11 如何實(shí)現(xiàn)自啟動(dòng)應(yīng)用
深入解析RK平臺(tái)編譯核心:build.sh的知識(shí)點(diǎn)、調(diào)試技巧與開(kāi)發(fā)價(jià)值
深入解析RK平臺(tái)GPIO驅(qū)動(dòng):從原理到調(diào)試,開(kāi)發(fā)者必看指南
深度解析SPL階段A/B分區(qū)啟動(dòng):spl_ab.c代碼全拆解
深入解析RK平臺(tái)Android/Linux Bootloader核心文件:android_bootloader.c
深入解析?RK?平臺(tái)顯示驅(qū)動(dòng):格式支持、處理流程與實(shí)現(xiàn)原理
深入理解?RK3506 U-Boot?重定位:從代碼到原理
深入解析rk平臺(tái)Android Bootloader核心代碼:從啟動(dòng)流程到AVB驗(yàn)證
評(píng)論