無線(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)にリセットされます。スロットの一部であるパーティションを変更すると、ブートローダーは「正常に起動」を消去して、スロットの再試行回数をリセットします。
また、ブートローダーは、読み込むスロットを決定する必要があります。図に決定プロセスの例を示しています。
試行するスロットを決定します。
slot-unbootableとマークされたスロットは読み込もうとしないでください。このスロットは fastboot から返された値と一致しているはずです。以下、このスロットを現在のスロットと呼びます。現在のスロットが
slot-successfulとマークされておらず、slot-retry-count = 0がある場合は、現在のスロットをslot-unbootableとマークします。次に、unbootableとマークされておらず、slot-successfulとマークされている別のスロットを選択します。これで、このスロットが選択されたスロットになりました。使用可能な現在のスロットがない場合は、リカバリで起動するか、ユーザーにわかりやすいエラー メッセージが表示されます。適切な
boot.imgを選択し、カーネル コマンドラインで正しいシステム パーティションへのパスを指定します。カーネル コマンドラインの
slot_suffixパラメータを入力します。起動します。
slot-successfulとマークされていない場合は、slot-retry-countを減らします。
fastboot ユーティリティは、フラッシュ コマンドの実行時にフラッシュするパーティションを決定します。たとえば、fastboot flash system system.img コマンドを実行すると、最初に current-slot 変数をクエリして、その結果をシステムに連結し、フラッシュするパーティションの名前を生成します(system_a、system_b など)。
現在のスロットを fastboot set_active コマンドまたはブート コントロール HAL の setActiveBootSlot コマンドを使用して設定する場合、ブートローダーは現在のスロットをアップデートし、slot-unbootable と slot-successful を消去し、再試行回数をリセットします。これが slot-unbootable を消去する唯一の方法です。
A/B アップデートを使用しないデバイス
A/B アップデートを使用しないデバイス(A/B アップデートができないデバイスをご覧ください)で OTA アップデートをサポートするには、デバイス ブートローダーが次の条件を満たしていることを確認します。
recoveryパーティションには、サポートされているパーティション(cache、userdata)からシステム イメージを読み取り、systemパーティションに書き込むことができるイメージが含まれている必要があります。ブートローダーは直接リカバリモードで起動する必要があります。
無線イメージのアップデートがサポートされている場合、
recoveryパーティションも無線をフラッシュできるようにする必要があります。これには、次の 2 通りの方法があります。ブートローダーで無線をフラッシュします。この場合、アップデートを完了するには、リカバリ パーティションからブートローダーに再起動できる必要があります。
リカバリ イメージで無線をフラッシュします。この機能は、バイナリ ライブラリまたはユーティリティとして提供される場合があります。