0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入解析rk平台Android A/B分区核心代码:android_ab.c全维度剖析

jf_44130326 来源:Linux1024 作者:Linux1024 2026-01-22 07:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Android系统的无缝更新(Seamless Updates)方案中,A/B(Slot A/B)分区机制是核心——它通过双系统槽位实现更新时不中断用户使用,更新失败也能快速回滚。而U-Boot作为嵌入式系统的第一阶段引导程序,承担了A/B分区槽位选择、元数据校验与管理的关键职责。本文将深度拆解U-Boot中android_ab.c的核心代码,逐一解析每个函数的功能、核心逻辑,梳理关键流程,并探讨开发者关注这部分代码的核心价值。

一、核心背景与代码定位

android_ab.c是U-Boot中处理Android A/B分区引导的核心模块,聚焦于bootloader阶段的A/B分区核心逻辑,主要负责:

•A/B分区元数据(bootloader_control)的读写、校验与初始化;

•最优启动槽位(Slot A/B)的筛选与选择;

•动态分区/虚拟AB机制的兼容性检测;

•根分区路径的动态构造与更新;

•启动尝试次数管理、Recovery分区适配等辅助逻辑。

这份代码是连接硬件底层与Android/Linux A/B系统的关键桥梁,直接决定了设备启动时的槽位选择逻辑和更新稳定性。

二、逐函数深度解析

我们按功能模块对核心函数分类解析,清晰梳理每个函数的定位与逻辑:

(一)元数据初始化与校验类

1.android_boot_control_compute_crc

作用:计算bootloader_control结构体的CRC32校验值(仅校验crc32_le字段前的字节),防止元数据篡改或损坏。

输入:指向android_bootloader_control的指针;

输出:32位CRC32校验值;

核心逻辑:调用crc32函数,以offsetof定位crc32_le字段偏移,仅计算该偏移前的字节校验和。

2.android_boot_control_default

作用:当A/B元数据损坏时,初始化默认值,保证系统能从默认槽位启动。

输入:指向android_bootloader_control的指针;

核心逻辑

a.设置魔法值(magic)、版本号(version)、槽位数量;

b.初始化所有槽位元数据(优先级15、尝试次数7、未标记成功启动等);

c.计算并填充CRC32校验值。

(二)元数据磁盘读写类

1.android_boot_control_create_from_disk

作用:从misc分区读取A/B元数据到内存,为后续校验/修改做准备,自动处理块对齐、分区大小检查。

输入:块设备描述符、分区信息;

输出:元数据缓冲区指针(失败返回NULL);

核心逻辑

a.计算元数据在misc分区的偏移(2KiB处),检查块对齐;

b.计算需读取的块数(向上取整),校验分区大小是否足够;

c.分配内存并读取数据,失败则释放内存返回NULL。

2.android_boot_control_store

作用:将修改后的元数据写回misc分区原位置,完成元数据更新。

输入:元数据缓冲区、块设备描述符、分区信息;

输出:0(成功)/-1(失败);

核心逻辑:计算偏移和块数,调用blk_dwrite写回数据,检查写入块数是否匹配。

(三)槽位选择核心类

1.android_ab_compare_slots

作用:比较两个槽位的优先级,确定最优启动槽位。

输入:两个android_slot_metadata指针;

输出:负数(a更优)、正数(b更优)、0(同等);

核心逻辑:按「优先级→成功启动标记→剩余尝试次数」的顺序比较,高优先级/已成功启动/尝试次数多的槽位更优。

2.android_ab_select(核心函数)

作用:读取元数据、校验完整性、筛选可启动槽位、选择最优槽位,并更新尝试次数/槽位后缀。

输入:块设备描述符、分区信息;

输出:选中的槽位索引(失败返回-1);

核心逻辑

a.读取misc分区元数据,校验CRC32(不匹配则初始化默认值);

b.校验魔法值/版本号合法性,非法则返回失败;

c.筛选可启动槽位(未损坏+尝试次数>0);

d.遍历槽位,调用android_ab_compare_slots选择最优;

e.若选中槽位未标记成功启动,递减尝试次数;

f.若元数据有修改,重新计算CRC并写回磁盘。

(四)虚拟AB消息处理类

1.read_misc_virtual_ab_message/write_misc_virtual_ab_message

作用:读取/写入misc分区中的虚拟AB元数据(适配Android虚拟A/B分区场景);

核心逻辑:定位boot设备与misc分区,计算偏移和块数,调用blk_dread/blk_dwrite完成读写。

(五)动态分区检测类

ab_is_support_dynamic_partition

作用:检测设备是否支持Android动态分区(super分区);

核心逻辑

a.优先检查是否存在super分区(存在则支持);

b.无super分区则检查boot镜像cmdline是否包含androidboot.super_partition(有则支持);

c.否则返回不支持。

(六)根分区路径更新类

1.get_partition_unique_uuid

作用:读取指定分区的UUID,用于构造root=PARTUUID=xxx启动参数。

2.ab_update_root_uuid

作用:兼容Android/Linux A/B场景,若bootargs无root=,则读取system分区UUID并添加到启动参数。

3.ab_update_root_partition

作用:根据存储类型(MMC/SPINAND/MTD)构造不同的root=路径,更新bootargs;

核心逻辑:跳过动态分区场景,按存储类型构造路径(如/dev/mmcblk0p%d、ubi.mtd=%d)。

(七)槽位与尝试次数管理类

1.ab_get_slot_suffix

作用:获取当前槽位后缀(_a/_b),失败则回退到lastboot标记。

2.ab_decrease_tries

作用:启动失败时,递减当前槽位的剩余尝试次数(次数为0则该槽位不可用);

核心逻辑:获取槽位→加载元数据→递减尝试次数→保存修改。

(八)Recovery分区检测类

ab_can_find_recovery_part

作用:检测是否存在recovery分区(兼容Linux A/B场景,需recovery分区更新系统);

核心逻辑:定位boot设备,查询recovery分区信息,存在则返回true。

三、核心流程可视化(android_ab_select)

以下是android_ab_select的核心流程:

wKgZPGlxXMmAMJJdAAMUjY3QIuY345.png

四、开发者关注这部分代码的核心意义

1.掌握A/B启动的底层逻辑

A/B分区的核心是bootloader阶段的槽位选择,这份代码完整实现了「元数据校验→槽位筛选→最优选择→元数据更新」的全流程。理解它能解决「槽位切换失败」「更新后启动回滚」「元数据损坏」等核心问题。

2.硬件平台适配的关键

不同芯片(如Rockchip)的存储介质(MMC/NAND/MTD/NVME)、分区布局差异极大,需基于此代码适配:

•调整根分区路径构造逻辑(ab_update_root_partition);

•适配动态分区/虚拟AB(ab_is_support_dynamic_partition);

•兼容不同存储类型的槽位元数据读写。

3.调试启动故障的核心抓手

当系统出现以下问题时,这份代码是定位根因的关键:

•CRC校验失败:元数据损坏/篡改;

•无可用槽位:所有槽位尝试次数为0或标记损坏;

•分区大小不足:misc分区无法容纳元数据;

•槽位切换异常:android_ab_compare_slots优先级逻辑不符合预期。

4.定制化更新策略

若需定制A/B规则(如调整槽位优先级、修改尝试次数阈值),可直接修改:

•android_boot_control_default:调整默认槽位参数;

•android_ab_compare_slots:修改槽位比较逻辑;

•ab_decrease_tries:调整尝试次数递减规则。

5.兼容新特性与跨系统场景

这份代码同时兼容:

•Android 10+动态分区(super分区);

•虚拟AB机制;

•Android A/B(无recovery)与Linux A/B(需recovery)跨系统场景。

理解这些逻辑能保证系统适配新版本Android规范。

五、总结

android_ab.c是U-Boot层实现Android A/B无缝更新的核心,覆盖了元数据管理、槽位选择、动态分区适配、根路径构造等全流程。对于嵌入式开发者而言,深入分析这份代码不仅能解决A/B启动的各类故障,还能基于硬件特性定制更新策略,是保证设备更新稳定性与兼容性的关键。无论是Android设备开发、Linux嵌入式系统适配,还是bootloader层的故障调试,这份代码的分析都具有极高的实践价值。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    4021

    浏览量

    133744
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3588 Android+Linux双系统方案的实现

    RK3588双系统启动流程如下图   uboot根据按键来识别要启动的系统,这里可以使用拨码开关来代替。 uboot在加载分区的时根据分区名字来区分加载android或者linux的
    的头像 发表于 10-10 14:25 1.1w次阅读
    <b class='flag-5'>RK</b>3588 <b class='flag-5'>Android</b>+Linux双系统方案的实现

    深度解析SPL阶段A/B分区启动:spl_ab.c代码拆解

    ( Secondary Program Loader ,二级程序加载器)作为系统启动的早期阶段,负责初始化硬件、选择启动分区, spl_ab.c 正是 SPL 层处理 A/B
    的头像 发表于 01-20 07:07 6420次阅读
    深度<b class='flag-5'>解析</b>SPL阶段<b class='flag-5'>A</b>/<b class='flag-5'>B</b><b class='flag-5'>分区</b>启动:spl_<b class='flag-5'>ab.c</b><b class='flag-5'>代码</b><b class='flag-5'>全</b>拆解

    Android系统与应用开发内容介绍

    及使用 5)AndroidManifest.xml分析10.Android的源代码结构与编译方法 实验:a.三种方法编写一个Hello Andro
    发表于 07-13 14:03

    Android系统与应用开发培训班

    的源代码结构与编译方法 实验:a.三种方法编写一个Hello Android的程序,深化认识Android平台的结构
    发表于 03-23 14:12

    分享高性能Android应用开发超清版PDF

    Telephony原理剖析与最佳实践深入理解ANDROID 卷3深入理解Android(卷2)(带
    发表于 08-13 10:40

    怎样去修改RK3229平台Android6.0系统的默认时区呢

    怎样去修改RK3229平台Android6.0系统的默认时区呢?怎么去修改RK3229平台Android
    发表于 03-09 06:11

    迅为iTOP-RK3568开发板Android11移植之源码结构简介

    硬件平台:迅为iTOP-3568开发板平台软件版本:Android11 手把手教你在rk3568开发板上移植Android11。内含硬件原理
    发表于 03-28 14:45

    如何实现基于RK3588的Android系统与Linux系统切换呢

    ,否则引导linux的boot,启动linux系统diff --git a/arch/arm/mach-rockchip/rk3588/rk3588.c b/arch/arm
    发表于 05-26 10:16

    利用RK3288固化Android系统的data分区

    前言Android 的 data 分区保存着系统的配置数据和用户安装的应用等重要信息。将该分区数据固化下来,便可以灵活地定制固件,而不用修改系统代码,加入诸多预置参数。但是,直接烧写
    发表于 06-27 10:21

    浅析RK3128 Android系统内核驱动的相关知识

      一、rk3128 android4.4 平台  主要用来做电视盒  二、内核目录结构  ├── android android基本配置参
    发表于 09-30 16:04

    Android Runtime源码解析》+深入体会第六章ART的执行(4)

    、RISC-V等开源社区,主要研究内容为Clang/LLVM、JVM等。 在深入阅读《Android Runtime源码解析》这本书之后,我对Android Runtime的内部机制有
    发表于 11-17 01:33

    深入剖析Android消息机制

    深入剖析Android消息机制
    发表于 01-22 21:11 11次下载

    Android案例分享,基于瑞芯微RK3568国产平台

    SDK:Rockchip_Android13_SDK_Release   硬件平台介绍 创龙科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核AR
    的头像 发表于 06-20 10:04 1667次阅读
    <b class='flag-5'>Android</b>案例分享,基于瑞芯微<b class='flag-5'>RK</b>3568国产<b class='flag-5'>平台</b>!

    深入解析RK平台Android/Linux Bootloader核心文件:android_bootloader.c

    参数组装等关键工作。(这个启动流程android和linux共用) 本文将从 文件定位、核心函数、执行流程 三个维度,拆解这个文件的底层逻辑。 一、文件核
    的头像 发表于 01-09 10:58 1143次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平台</b><b class='flag-5'>Android</b>/Linux Bootloader<b class='flag-5'>核心</b>文件:<b class='flag-5'>android_bootloader.c</b>

    深入解析rk平台Android Bootloader核心代码:从启动流程到AVB验证

    android_bootloader.c核心代码,带你读懂Android设备从Bootloader到内核的完整启动逻辑,以及开发者关注这些代码
    的头像 发表于 01-22 07:06 127次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平台</b><b class='flag-5'>Android</b> Bootloader<b class='flag-5'>核心</b><b class='flag-5'>代码</b>:从启动流程到AVB验证