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 更新的回溯機制。如果系統不小心進入不理想的狀態,我們可以復原至上一個已知的理想狀態。