作为Android设备启动的第一道“闸门”,Bootloader(以U-Boot为主)承担着初始化硬件、加载内核、验证镜像完整性的核心职责。今天我们拆解Rockchip平台下android_bootloader.c的核心代码,带你读懂Android设备从Bootloader到内核的完整启动逻辑,以及开发者关注这些代码的核心价值。
一、代码整体定位
这份代码是Rockchip(瑞芯微)平台U-Boot中Android Bootloader的核心实现,核心作用是衔接硬件初始化与内核启动,主要负责:
•读写Bootloader控制块(BCB),判断设备启动模式(正常/Recovery/Bootloader);
•执行Android Verified Boot(AVB)验证,保障镜像完整性;
•加载内核/设备树镜像,组装内核命令行,最终启动内核;
•适配A/B分区、DTBO叠加层等Android特性。
二、核心函数解析:从启动模式判断到内核启动
我们按“启动流程链路”拆解关键函数,理解每个环节的核心作用:
1. BCB读写:启动指令的“中转站”
BCB(Bootloader Control Block)是存储在misc分区的启动控制信息,决定设备下次启动的模式,核心操作由两个函数完成:
android_bootloader_message_load
•作用:从misc分区读取BCB数据到内存;
•关键逻辑:检查misc分区大小是否足够容纳BCB结构体→调用blk_dread读取指定扇区→失败则输出日志并返回错误。
android_bootloader_message_write
•作用:将内存中的BCB数据写入misc分区;
•关键逻辑:与读操作逻辑对称,调用blk_dwrite写入→支持“一次性指令”(如bootonce-bootloader)的清空。
android_bcb_write
•作用:向BCB写入自定义启动命令(如boot-recovery);
•关键逻辑:初始化空BCB结构体→查找misc分区→写入指定命令(如强制进入Recovery)。
2.启动模式判断:决定设备“走哪条路”
android_bootloader_load_and_clear_mode
•作用:核心启动模式决策函数;
•关键逻辑:
a.先检查Fastboot缓冲区(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)转换为字符串(如recovery),便于日志输出和调试。
3. Bootloader模式:进入Fastboot
android_bootloader_boot_bootloader
•作用:触发Fastboot模式;
•关键逻辑:读取环境变量fastbootcmd(无则用默认值fastboot usb 0)→执行该命令,让设备进入Fastboot刷机模式。
4.内核加载与启动:核心执行环节
sysmem_alloc_uncomp_kernel
•作用:为解压后的内核分配内存;
•关键逻辑:
a.根据内核压缩类型(LZ4/GZIP/LZO等),按压缩比反向计算解压后大小(如GZIP按40%压缩比,分配2.5倍原大小);
b.释放压缩内核占用的内存→分配解压内核所需内存,避免内存溢出。
android_bootloader_boot_kernel
•作用:最终启动内核的“临门一脚”;
•关键逻辑:
a.解析内核地址、压缩类型(如LZ4),输出启动日志;
b.调用sysmem_alloc_uncomp_kernel分配解压内存;
c.调用do_bootm_states执行内核启动流程(加载OS、初始化RAMDisk、执行内核)。
5.内核命令行:给内核的“启动参数”
strjoin
•作用:基础工具函数,将字符串数组用指定分隔符(如空格)拼接成完整字符串。
android_assemble_cmdline
•作用:组装内核启动命令行(bootargs);
•关键逻辑:拼接以下参数,生成最终bootargs:
○环境变量默认bootargs;
○A/B分区后缀(如androidboot.slot_suffix=_a);
○设备序列号(androidboot.serialno=xxx);
○Root设备路径(root=/dev/xxx);
○额外参数(如Normal模式的skip_initramfs)。
6. AVB验证:启动安全性的“守门人”
AVB(Android Verified Boot)是Android的镜像验证机制,防止恶意镜像刷入,核心函数如下:
android_slot_verify
•作用:核心AVB验证函数;
•关键逻辑:
a.检查设备解锁状态(解锁则跳过严格验证);
b.获取A/B分区元数据,确定当前启动slot(_a/_b);
c.调用avb_slot_verify验证boot/recovery/vendor_boot等分区镜像;
d.验证失败则标记该slot为不可启动→验证成功则分发镜像到指定内存地址。
slot_set_unbootable
•作用:将指定A/B分区标记为“不可启动”;
•关键逻辑:清空分区优先级、剩余尝试次数、启动成功标记,防止设备启动损坏的镜像。
7.设备树适配:硬件适配的“灵活层”
android_get_dtbo&android_fdt_overlay_apply
•作用:加载并应用DTBO(设备树叠加层);
•关键逻辑:
a.从dtbo/recovery分区读取DTBO镜像;
b.选择指定索引的设备树条目;
c.将DTBO叠加到主设备树(适配不同硬件配置)→失败则恢复原设备树。
8.核心启动流程:android_bootloader_boot_flow
这是整个Bootloader启动的“总控函数”,串联所有环节:
1.读取misc分区,判断启动模式(Normal/Recovery/Bootloader);
2.处理A/B分区slot后缀;
3.执行AVB验证(若开启);
4.加载boot/recovery镜像到指定内存;
5.组装内核命令行;
6.加载DTBO并应用叠加层;
7.调用android_bootloader_boot_kernel启动内核。
三、核心启动流程图

四、开发者关注这部分代码的核心意义
1.定制启动逻辑,适配产品需求
•可修改BCB指令逻辑,实现定制化启动(如强制进入Recovery、修改Fastboot默认命令);
•适配不同Android版本特性(如动态分区下skip_initramfs替换为androidboot.force_normal_boot=1)。
2.保障启动安全性,合规Android规范
•AVB验证是Google Play认证的核心要求,理解android_slot_verify等函数,可确保镜像验证逻辑符合Android安全规范;
•处理A/B分区元数据,避免设备因镜像损坏无法启动(标记不可启动slot)。
3.快速定位启动故障
•启动失败(如无法进入Recovery、内核崩溃)时,可通过函数日志定位问题:
○misc分区读写失败→检查分区大小/扇区地址;
○AVB验证失败→排查镜像签名/rollback索引;
○内存分配失败→调整内核解压内存计算逻辑。
4.适配硬件与内核,提升兼容性
•DTBO叠加层逻辑可适配同芯片不同硬件配置(如不同屏幕/传感器);
•内核压缩格式适配(LZ4/GZIP等),优化启动速度(代码中已标注RK3308不同压缩格式的启动耗时,LZ4最优)。
5.定制内存布局,优化启动性能
•sysmem_alloc_uncomp_kernel函数决定内核解压内存的分配策略,合理调整压缩比计算逻辑,可避免内存溢出,同时优化启动速度。
五、总结
android_bootloader.c是Rockchip平台Android Bootloader的“心脏”,串联了启动模式判断、安全验证、镜像加载、内核启动全链路。对于开发者而言:
•理解它,能定制符合产品需求的启动逻辑;
•掌握它,能快速定位启动故障,保障设备稳定性;
•吃透它,能适配Android安全规范,兼顾功能性与安全性。
无论是做Android底层定制、设备刷机工具开发,还是解决Bootloader启动问题,这份代码都是绕不开的核心——它不仅是代码,更是Android设备从“硬件初始化”到“系统启动”的完整逻辑闭环。
审核编辑 黄宇
-
Android
+关注
关注
12文章
4035浏览量
134501 -
AVB
+关注
关注
0文章
16浏览量
5705
发布评论请先 登录
深度解析 | DMA-BUF适配Android与RK特性核心Patch:高性能内存管理升级方案
一文吃透RK平台OTA升级开发:从逻辑到调试的完整指南
技术分享 | RK3568 Android11 如何实现自启动应用
深入解析RK平台编译核心:build.sh的知识点、调试技巧与开发价值
深入解析RK平台GPIO驱动:从原理到调试,开发者必看指南
深入解析RK平台Android/Linux Bootloader核心文件:android_bootloader.c
深入理解 RK3506 U-Boot 重定位:从代码到原理
深入解析rk平台Android Bootloader核心代码:从启动流程到AVB验证
评论