OTA アップデートの実装

無線(OTA)アップデートを実装するには、ブートローダーが起動中にリカバリ RAM ディスクにアクセスできることが必要です。変更されていない AOSP リカバリ イメージをデバイスが使用する場合、ブートローダーは misc パーティションの最初の 32 バイトを読み取ります。そのデータが boot-recovery と一致すると、ブートローダーは recovery イメージで起動します。この方法により、保留中のリカバリ作業(たとえば、OTA の適用やデータの削除)を最後まで続行できます。

リカバリとブートローダーによる通信に使用されるブロック内のフラッシュのコンテンツの詳細については、bootable/recovery/bootloader_message/bootloader_message.h をご覧ください。

A/B アップデートを使用するデバイス

A/B アップデートを使用するデバイスで OTA アップデートをサポートするには、デバイス ブートローダーが次の条件を満たしていることを確認します。

一般的な条件

  • OTA によってアップデートされるすべてのパーティションは、(リカバリ時にアップデートされるのではなく)メインシステムの起動中にアップデートできる必要があります。

  • system パーティションを起動するには、ブートローダーがカーネルのコマンドラインで次の値を渡すようにします: ro root=/dev/[node] rootwait init=/init

  • HAL からの markBootSuccessful の呼び出しは、Android フレームワークが行います。ブートローダーがパーティションを「正常に起動」としてマークしないようにする必要があります。

ブート コントロール HAL のサポート

ブートローダーは、hardware/libhardware/include/hardware/boot_control.h で定義されている boot_control HAL をサポートする必要があります。アップデータは ブート コントロール HAL に対するクエリ、使用されていないブートスロットの更新、HAL を使用しているアクティブ スロットの変更、更新されたオペレーティング システムの再起動を行います。詳しくは、ブート コントロール HAL の実装をご覧ください。

スロットのサポート

ブートローダーは、パーティションとスロットに関連する次の機能をサポートする必要があります。

  • パーティション名には、どのパーティションがブートローダー内の特定のスロットに属するかを識別するサフィックスを含める必要があります。パーティションごとに、対応する変数 has-slot:partition base name があり、値は yes になっています。スロットはアルファベット順に a、b、c のように名前が付けられます。これらはパーティションのサフィックス _a_b_c などに対応しています。ブートローダーは、どのスロットがコマンドライン プロパティ androidboot.slot_suffix を使用して起動されたかをオペレーティング システムに通知する必要があります。Android 12 以降でリリースするデバイスの場合、このプロパティは bootconfig を介して設定されます。

  • slot-retry-count 値は、setActiveBootSlot コールバックまたは fastboot set_active コマンドを通じて、ブート コントロール HAL によりプラスの値(通常は 3)にリセットされます。スロットの一部であるパーティションを変更すると、ブートローダーは「正常に起動」を消去して、スロットの再試行回数をリセットします。

また、ブートローダーは、読み込むスロットを決定する必要があります。図に決定プロセスの例を示しています。

ブートローダーのスロットフロー
図 1. ブートローダーのスロットフロー
  1. 試行するスロットを決定します。slot-unbootable とマークされたスロットは読み込もうとしないでください。このスロットは fastboot から返された値と一致しているはずです。以下、このスロットを現在のスロットと呼びます。

  2. 現在のスロットが slot-successful とマークされておらず、slot-retry-count = 0 がある場合は、現在のスロットを slot-unbootable とマークします。次に、unbootable とマークされておらず、slot-successful とマークされている別のスロットを選択します。これで、このスロットが選択されたスロットになりました。使用可能な現在のスロットがない場合は、リカバリで起動するか、ユーザーにわかりやすいエラー メッセージが表示されます。

  3. 適切な boot.img を選択し、カーネル コマンドラインで正しいシステム パーティションへのパスを指定します。

  4. カーネル コマンドラインの slot_suffix パラメータを入力します。

  5. 起動します。slot-successful とマークされていない場合は、slot-retry-count を減らします。

fastboot ユーティリティは、フラッシュ コマンドの実行時にフラッシュするパーティションを決定します。たとえば、fastboot flash system system.img コマンドを実行すると、最初に current-slot 変数をクエリして、その結果をシステムに連結し、フラッシュするパーティションの名前を生成します(system_asystem_b など)。

現在のスロットを fastboot set_active コマンドまたはブート コントロール HAL の setActiveBootSlot コマンドを使用して設定する場合、ブートローダーは現在のスロットをアップデートし、slot-unbootableslot-successful を消去し、再試行回数をリセットします。これが slot-unbootable を消去する唯一の方法です。

A/B アップデートを使用しないデバイス

A/B アップデートを使用しないデバイス(A/B アップデートができないデバイスをご覧ください)で OTA アップデートをサポートするには、デバイス ブートローダーが次の条件を満たしていることを確認します。

  • recovery パーティションには、サポートされているパーティション(cacheuserdata)からシステム イメージを読み取り、system パーティションに書き込むことができるイメージが含まれている必要があります。

  • ブートローダーは直接リカバリモードで起動する必要があります。

  • 無線イメージのアップデートがサポートされている場合、recovery パーティションも無線をフラッシュできるようにする必要があります。これには、次の 2 通りの方法があります。

    • ブートローダーで無線をフラッシュします。この場合、アップデートを完了するには、リカバリ パーティションからブートローダーに再起動できる必要があります。

    • リカバリ イメージで無線をフラッシュします。この機能は、バイナリ ライブラリまたはユーティリティとして提供される場合があります。