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 說明文件的「實作 Boot Control 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 的本機建構作業,通常會是 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 版本包含 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 套件是否符合系統更新要求,以及是否可以安裝。

此外,SDV 也遵循 Android 的 APEX 可更新性概念。因此,如果 APEX 不是啟動 APEX,則可以更新 APEX。Bootstrap APEX 必須透過系統更新進行更新,且符合下列任一條件:

  • 宣告的版本高於預先安裝的版本,且兩者都大於或等於 1。

或

  • 宣告的版本是非預先安裝的 APEX,且版本高於拒絕清單中的版本 (如有列出)。

SDV 通常會部署到網路中的多個系統。因此,您必須確保對單一系統進行的更新能正確執行。不過,這項措施無法保證所有系統都能正常通訊。

更新整體網路也同樣重要,這需要將服務套件的更新同時部署到所有機器,或更新不含破壞性變更。例如對介面進行不相容的變更。

雖然 SDV 未提供偵測不相容變更的工具,但我們的指南說明瞭如何協調對介面所做的變更,以及部署變更所需的最佳做法。

此外,SDV 支援系統和 APEX 更新的回溯機制。如果系統不小心進入不理想的狀態,我們可以復原至上一個已知的理想狀態。