A/B 系统更新

SDV 遵循 A/B(无缝)系统更新的标准 Android 方法。AOSP 文档主要适用于 SDV。本页面详细介绍了 SDV 的特定用法,以及构建和应用更新包的已知良好路径。

SDV 配置为使用非虚拟 A/B 更新。如需通过服务软件包为自定义 /oem_ab 分区配置和触发 A/B 更新,请参阅 OEM AB 分区更新。

实现启动控件 HAL

适用于 Cuttlefish 的 SDV Core 映像 (sdv_core_cf) 提供了基于 hardware/interfaces/boot/aidl/default/ 的启动控件 HAL 的标准实现。其他引导加载程序必须实现 HAL 才能支持 A/B 更新。

如需了解详情,请参阅 AOSP 文档的实现启动控件 HAL 部分。您可以使用调试(eng 和 userdebug)SDV 映像中包含的 bootctl 来测试实现。

生成 OTA 软件包

如需了解详情,请参阅构建 OTA 软件包。本页面中的说明遵循 AOSP 文档,但略有不同。

整体更新

在代码库根目录中:

source build/envsetup.sh && lunch sdv_core_cf-aosp_current-userdebug
mkdir dist_output
m dist DIST_DIR=dist_output

这些命令会在 dist_output 目录中生成目标文件。对于 sdv_core_cf 的本地 build,此路径通常为 sdv_core_cf-target_files-$USER.zip。

如需生成 OTA 软件包,您需要使用 ota_from_target_files。与 AOSP 中不同,该软件包不会作为 m dist 的一部分进行构建。

m ota_from_target_files
ota_from_target_files \
  dist_output/sdv_core_cf-target_files-$USER.zip \
  ota_update.zip

增量更新

与 AOSP 中相同的 ota_from_target_files 调用:

ota_from_target_files \
  -i PREVIOUS-sdv_core_cf-target_files.zip \
  dist_new/sdv_core_cf-target_files-$USER.zip \
  incremental_ota_update.zip

安装 OTA 软件包

更新是使用 update_engine 服务安装的。调试 SDV build 包含 update_engine_client,可用于调试和测试更新过程。

如需安装 OTA 软件包,请运行以下命令:

system/update_engine/scripts/update_device.py ota_update.zip

如果更新已正确安装(最终状态为 UPDATE_STATUS_UPDATED_NEED_REBOOT,结果为 ErrorCode::kSuccess),则更新将在下次重启时激活。

版本控制

对于系统更新,SDV 会使用 Android 的 OTA 软件包元数据来确定 OTA 软件包是否符合要求且可以安装。

此外,对于 APEX,SDV 遵循 Android 关于可更新性的概念。因此,如果 APEX 不是引导 APEX,则可以更新。引导 APEX 必须通过系统更新进行更新,并且:

  • 声明的 version 高于预安装的版本,并且两者都大于或等于 1,

或

  • 声明的 version 是非预安装的 APEX,并且版本高于拒绝清单中的版本(如果已列出)。

SDV 通常部署到网络中的多个系统。因此,您必须确保对单个系统所做的更新正确执行。不过,这种谨慎并不能保证所有系统都能正常通信。

同样重要的是,您需要更新整个网络,这要求服务包的更新要么同时部署到所有机器,要么更新不包含破坏性更改。例如,对接口进行不兼容的更改。

虽然 SDV 不提供用于检测不兼容更改的工具,但我们的指南介绍了如何协调对接口所做的更改,以及部署这些更改所需的最佳实践。

此外,SDV 还支持系统和 APEX 更新的回滚机制。如果系统无意中进入不令人满意的状态,我们可以恢复到上一个已知的令人满意的状态。