实现 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

  • Android 框架负责从 HAL 调用 markBootSuccessful。引导加载程序绝不应将分区标记为已成功启动。

对启动控件 HAL 的支持

引导加载程序必须支持 hardware/libhardware/include/hardware/boot_control.h 中定义的 boot_control HAL。更新程序会查询启动控件 HAL,更新未使用的启动槽位,使用 HAL 更改活动槽位,并重新启动进入更新后的操作系统。如需了解详情,请参阅实现启动控件 HAL

对槽位的支持

引导加载程序必须支持与分区和槽位相关的功能,包括:

  • 分区名称必须包含一个后缀,用于标识哪些分区属于引导加载程序中的特定槽位。对于每个这样的分区,都有一个相应的变量 has-slot:partition base name,其值为 yes。槽位按字母顺序命名为 a、b、c 等,与后缀为 _a_b_c 的分区相对应。引导加载程序应通知操作系统使用命令行属性 androidboot.slot_suffix 启动的槽位。对于发布时搭载 Android 12 或更高版本的设备,此属性通过 bootconfig 进行设置。

  • slot-retry-count 值将由启动控件 HAL 通过 setActiveBootSlot 回调或通过 fastboot set_active 命令重置为正值(通常为 3)。修改属于某个槽位的分区时,引导加载程序会清除“已成功启动”的分区并重置槽位的重试次数。

引导加载程序还应确定要加载的槽位。下图显示的是一个决策过程示例。

引导加载程序槽位加载流程
图 1. 引导加载程序槽位加载流程
  1. 确定要尝试加载的槽位。不要尝试加载标记为 slot-unbootable 的槽位。此槽位应与 fastboot 返回的值一致,称为当前槽位。

  2. 如果当前槽位未标记为 slot-successful 且具有 slot-retry-count = 0,请将当前槽位标记为 slot-unbootable。然后选择一个未标记为 unbootable 而是标记为 slot-successful 的其他槽位;此槽位现在是选定的槽位。如果没有当前槽位可用,系统会启动到恢复模式或向用户显示一条有意义的错误消息。

  3. 选择相应的 boot.img,并在内核命令行上添加正确系统分区的路径。

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

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

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

使用 fastboot set_active 命令或启动控件 HAL setActiveBootSlot 命令设置当前槽位时,引导加载程序应更新当前槽位,清除 slot-unbootableslot-successful,并重置重试计数(这是清除 slot-unbootable 的唯一方法)。

不使用 A/B 更新的设备

如需在不使用 A/B 更新的设备上支持 OTA 更新(请参阅非 A/B 更新设备),请确保设备引导加载程序符合以下条件。

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

  • 引导加载程序应支持直接启动进入恢复模式。

  • 如果支持无线装置映像更新,recovery 分区还应能够刷写无线装置。这可通过以下两种方式之一来完成:

    • 引导加载程序刷写无线装置。在这种情况下,应该可以从恢复分区重新启动回引导加载程序以完成更新。

    • 恢复映像刷写无线装置。此功能可以作为二进制库或实用程序提供。