支持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值通过setActiveBootSlot回调或通过fastboot set_active命令由引导控制 HAL 重置为正值(通常为3 )。当修改属于插槽一部分的分区时,引导加载程序会清除“成功引导”并重置插槽的重试计数。

引导加载程序还应该确定要加载哪个插槽。该图显示了决策过程示例。

Bootloader开槽流程
图 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实用程序确定在运行任何闪存命令时要闪存哪个分区。例如,运行fastboot flash system system.img命令首先查询current-slot变量,然后将结果连接到 system 以生成应闪存的分区的名称( system_asystem_b等)。

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

没有 A/B 更新的设备

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

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

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

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

    • 引导加载程序使无线电闪烁。在这种情况下,应该可以从恢复分区重新引导回引导加载程序以完成更新。

    • 恢复图像闪烁收音机。此功能可以作为二进制库或实用程序提供。