A/B 系统更新

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

目前,SDV 配置为使用非虚拟 A/B 更新。

实现启动控件 HAL

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

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

生成 OTA 软件包

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

整体更新

在代码库根目录中:

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

这些命令会在 dist_output 目录中生成目标文件。对于本地 build,这通常是sdv_core_cf-target_files-$USER.zipsdv_core_cf

如需生成 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。启动 APEX 必须通过系统更新进行更新,并且:

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

或者,

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

SDV 通常部署到网络中的多个系统。因此,您必须确保对单个系统所做的更新能够正确执行。不过,即使如此,也不能保证所有系统都能正常通信。

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

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

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