实施 OTA 更新

要实现 无线下载 (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。下图展示了一个决策流程示例。

Bootloader slotting flow
图 1. Bootloader slotting 流程
  1. 确定要尝试的 slot。不要尝试加载标记为 slot-unbootable 的 slot。此 slot 应与 fastboot 返回的值一致,并被称为当前 slot。

  2. 如果当前 slot 未标记为 slot-successfulslot-retry-count = 0,则将当前 slot 标记为 slot-unbootable。然后选择另一个未标记为 unbootable 且标记为 slot-successful 的 slot;此 slot 现在是选定的 slot。如果没有可用的当前 slot,则启动到 recovery 模式或向用户显示有意义的错误消息。

  3. 选择合适的 boot.img,并在内核命令行中添加指向正确 system 分区的路径。

  4. 填充内核命令行 slot_suffix 参数。

  5. 启动。如果未标记为 slot-successful,则递减 slot-retry-count

运行任何 flash 命令时,fastboot 实用程序会确定要刷写哪个分区。例如,运行 fastboot flash system system.img 命令时,会先查询 current-slot 变量,然后将结果与 system 连接,以生成应刷写的分区的名称 (system_asystem_b 等)。

使用 fastboot set_active 命令或启动控制 HAL setActiveBootSlot 命令设置当前 slot 时,bootloader 应更新当前 slot,清除 slot-unbootableslot-successful,并重置重试计数(这是清除 slot-unbootable 的唯一方法)。

不使用 A/B 更新的设备

为了在不使用 A/B 更新的设备上支持 OTA 更新(请参阅不使用 A/B 更新的可更新设备),请确保设备 bootloader 符合以下条件。

  • recovery 分区应包含一个能够从某个受支持的分区(cacheuserdata)读取 system 镜像并将其写入 system 分区的镜像。

  • bootloader 应支持直接启动到 recovery 模式。

  • 如果支持无线电 (radio) 镜像更新,则 recovery 分区还应能够刷写无线电 (radio)。这可以通过以下两种方式之一完成:

    • bootloader 刷写无线电 (radio)。在这种情况下,应可以从 recovery 分区重启回到 bootloader 以完成更新。

    • recovery 镜像刷写无线电 (radio)。 这项功能可以作为二进制库或实用程序提供。