A/B 系統更新

SDV 採用標準 Android 的 A/B (無縫) 系統更新方法。AOSP 說明文件主要適用於 SDV。本頁詳細說明 SDV 的特定用法,以及建構和套用更新套件的已知良好路徑。

目前 SDV 設定為使用非虛擬 A/B 更新。

實作開機控制 HAL

Cuttlefish 的 SDV Core 映像檔 (sdv_core_cf) 提供以 hardware/interfaces/boot/aidl/default/ 為基礎的開機控制 HAL 標準實作項目。其他開機載入程式必須實作 HAL,才能支援 A/B 更新。

詳情請參閱 AOSP 說明文件的「實作開機控制 HAL」一節。您可以使用偵錯 (enguserdebug) SDV 映像檔隨附的 bootctl 測試實作項目。

產生 OTA 套件

詳情請參閱「建構 OTA 套件」。本頁的說明與 Android 開放原始碼計畫說明文件略有不同。

完整的更新

從存放區根目錄:

source build/envsetup.sh && lunch sdv_core_cf-trunk_staging-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

分批更新

Android 開放原始碼計畫中的 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 套件是否符合需求並可安裝。

此外,對於 APEX,SDV 遵循 Android 的可更新性概念。因此,APEX 不是啟動 APEX 時,即可更新 APEX。啟動 APEX 必須透過系統更新進行更新,且符合下列任一條件:

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

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

SDV 通常會部署至網路中的多個系統,因此您必須確保對單一系統所做的更新能正確執行。不過,即使如此,也無法保證所有系統都能正常通訊。

更新整體網路同樣至關重要,這需要將服務套件更新部署至所有機器,或更新不含重大變更。舉例來說,介面不相容的變更。

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

此外,SDV 支援系統和 APEX 更新的復原機制。如果系統意外進入不令人滿意的狀態,我們可以復原至最後一個已知的令人滿意狀態。