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」一節。您可以使用偵錯 (eng 和 userdebug) 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 更新的復原機制。如果系統意外進入不令人滿意的狀態,我們可以復原至最後一個已知的令人滿意狀態。