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 调试版(eng
和 userdebug)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.zip。sdv_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 更新的回滚机制。如果系统意外进入不令人满意的状态,我们可以恢复到上次已知的令人满意的状态。