無線(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 通りの方法があります。ブートローダーで無線をフラッシュします。この場合、アップデートを完了するには、リカバリ パーティションからブートローダーに再起動できる必要があります。
リカバリ イメージで無線をフラッシュします。この機能は、バイナリ ライブラリまたはユーティリティとして提供される場合があります。