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 の標準実装を提供します。他のブートローダーは、A/B アップデートをサポートするために HAL を実装する必要があります。
詳しくは、AOSP ドキュメントのブート コントロール 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 パッケージが要件を満たし、インストール可能かどうかを判断します。
また、APEX の場合、SDV は更新可能性に関する Android のコンセプトに従います。したがって、APEX がブートストラップ APEX でない場合は、APEX を更新できます。ブートストラップ APEX は、システム アップデートを通じて更新する必要があります。また、次のいずれかを行う必要があります。
- 宣言された version がプリインストールされたバージョンより大きく、両方が 1 以上である。
または、
- 宣言されたバージョンがプリインストールされていない APEX であり、バージョンが拒否リストに記載されているバージョンより上位である。
SDV は通常、ネットワーク内の複数のシステムにデプロイされます。そのため、単一のシステムに対して行われた更新が正しく実行されるようにする必要があります。ただし、この注意を払っても、すべてのシステムが適切に通信できるとは限りません。
ネットワーク全体を更新することも同様に重要です。そのためには、サービス バンドルの更新をすべてのマシンに同時にデプロイするか、更新に互換性を破る変更が含まれないようにする必要があります。たとえば、インターフェースに互換性のない変更が加えられた場合です。
SDV には、互換性のない変更を検出するツールは用意されていませんが、ガイドラインには、インターフェースに加えられた変更を調整する方法と、変更をデプロイするために必要なベスト プラクティスが記載されています。
さらに、SDV はシステム アップデートと APEX アップデートのロールバック メカニズムをサポートしています。システムが意図せず不満足な状態になった場合は、最後に確認された満足な状態を復元できます。