要实现 无线下载 (OTA) 更新,启动加载程序必须能够在启动期间访问恢复 RAM 磁盘。如果设备使用未修改的 AOSP 恢复映像,则启动加载程序会读取 misc
分区上的前 32 个字节;如果那里的数据与 boot-recovery
匹配,则启动加载程序会启动进入 recovery
映像。此方法支持继续完成任何待处理的恢复工作(例如,应用 OTA 或移除数据)。
如需详细了解闪存中用于恢复和启动加载程序进行通信的块的内容,请参阅 bootable/recovery/bootloader_message/bootloader_message.h。
具有 A/B 更新的设备
为了支持在使用 A/B 更新 的设备上进行 OTA 更新,请确保设备启动加载程序符合以下条件。
一般条件
通过 OTA 更新的所有分区都应在主系统启动时(而不是在恢复模式下更新)可更新。
为了启动
system
分区,启动加载程序在内核命令行中传递以下值:ro root=/dev/[node] rootwait init=/init
。调用
markBootSuccessful
(从 HAL)是 Android 框架的责任。启动加载程序绝不应将分区标记为成功启动。
对启动控制 HAL 的支持
启动加载程序必须支持 boot_control
HAL,如 hardware/libhardware/include/hardware/boot_control.h
中所定义。更新程序查询 启动控制 HAL,更新未使用的启动槽,使用 HAL 更改活动槽,然后重启进入更新后的操作系统。如需了解详情,请参阅实现启动控制 HAL。
对槽位的支持
启动加载程序必须支持与分区和槽位相关的功能,包括:
分区名称必须包含一个后缀,用于标识哪些分区属于启动加载程序中的特定槽位。对于每个此类分区,都有一个对应的变量
has-slot:分区基本名称
,其值为yes
。槽位按字母顺序命名为 a、b、c 等,分别对应于后缀为_a
、_b
、_c
等的分区。启动加载程序应使用命令行属性androidboot.slot_suffix
通知操作系统启动了哪个槽位。对于搭载 Android 12 或更高版本的设备,此属性通过 bootconfig 设置。slot-retry-count
值会被重置为一个正值(通常为3
),可以通过启动控制 HAL,经由setActiveBootSlot
回调完成重置,也可以通过fastboot set_active
命令完成重置。修改属于某个 slot 的分区时,bootloader 会清除“成功启动”标记并重置该 slot 的重试计数。
bootloader 还应确定要加载哪个 slot。下图展示了一个决策流程示例。

确定要尝试的 slot。不要尝试加载标记为
slot-unbootable
的 slot。此 slot 应与 fastboot 返回的值一致,并被称为当前 slot。如果当前 slot 未标记为
slot-successful
且slot-retry-count = 0
,则将当前 slot 标记为slot-unbootable
。然后选择另一个未标记为unbootable
且标记为slot-successful
的 slot;此 slot 现在是选定的 slot。如果没有可用的当前 slot,则启动到 recovery 模式或向用户显示有意义的错误消息。选择合适的
boot.img
,并在内核命令行中添加指向正确 system 分区的路径。填充内核命令行
slot_suffix
参数。启动。如果未标记为
slot-successful
,则递减slot-retry-count
。
运行任何 flash 命令时,fastboot
实用程序会确定要刷写哪个分区。例如,运行 fastboot flash system system.img
命令时,会先查询 current-slot
变量,然后将结果与 system 连接,以生成应刷写的分区的名称 (system_a
、system_b
等)。
使用 fastboot set_active
命令或启动控制 HAL setActiveBootSlot
命令设置当前 slot 时,bootloader 应更新当前 slot,清除 slot-unbootable
和 slot-successful
,并重置重试计数(这是清除 slot-unbootable
的唯一方法)。
不使用 A/B 更新的设备
为了在不使用 A/B 更新的设备上支持 OTA 更新(请参阅不使用 A/B 更新的可更新设备),请确保设备 bootloader 符合以下条件。
recovery
分区应包含一个能够从某个受支持的分区(cache
、userdata
)读取 system 镜像并将其写入system
分区的镜像。bootloader 应支持直接启动到 recovery 模式。
如果支持无线电 (radio) 镜像更新,则
recovery
分区还应能够刷写无线电 (radio)。这可以通过以下两种方式之一完成:bootloader 刷写无线电 (radio)。在这种情况下,应可以从 recovery 分区重启回到 bootloader 以完成更新。
recovery 镜像刷写无线电 (radio)。 这项功能可以作为二进制库或实用程序提供。