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

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