實作 OTA 更新

如要實作無線更新 (OTA),系統啟動載入程式必須能在啟動期間存取復原 RAM 磁碟。如果裝置使用未經修改的 AOSP 復原映像檔,系統啟動載入程式會讀取 misc 分區的前 32 個位元組;如果該資料與 boot-recovery 相符,系統啟動載入程式就會啟動 recovery 映像檔。這個方法可讓任何待處理的復原作業 (例如套用 OTA 或移除資料) 繼續完成。

如要進一步瞭解復原和引導程式用於通訊的快閃記憶體區塊內容,請參閱 bootable/recovery/bootloader_message/bootloader_message.h

使用 A/B 更新的裝置

如要在使用 A/B 更新的裝置上支援 OTA 更新,請確認裝置引導程式符合下列條件。

一般標準

  • 透過 OTA 更新的所有分區,應在主要系統啟動時可更新 (且不會在復原模式中更新)。

  • 如要啟動 system 分割區,Bootloader 會在核心指令列上傳遞以下值:ro root=/dev/[node] rootwait init=/init

  • Android 架構負責從 HAL 呼叫 markBootSuccessful。系統啟動載入程式不應將分區標示為已成功啟動。

支援啟動控制 HAL

系統啟動載入程式必須支援 hardware/libhardware/include/hardware/boot_control.h 中定義的 boot_control HAL。更新器會查詢 boot control HAL、更新未使用的啟動槽、使用 HAL 變更有效的槽,然後重新啟動至更新的作業系統。詳情請參閱「實作啟動控制 HAL」。

支援時段

引導程式庫必須支援與分割區和插槽相關的功能,包括:

  • 分割區名稱必須包含後置字串,用於識別哪些分割區屬於 Bootloader 中的特定插槽。每個這類區隔都有一個對應的變數 has-slot:partition base name,其值為 yes。時段會以字母 a、b、c 等字母命名,對應的區段則會加上 _a_b_c 等字尾。引導程式應使用命令列屬性 androidboot.slot_suffix 通知作業系統所啟動的時段。針對搭載 Android 12 以上版本的裝置,這項屬性會透過 bootconfig 設定。

  • slot-retry-count 值會重設為正值 (通常為 3),方法是透過 setActiveBootSlot 回呼或 fastboot set_active 指令,由啟動控制 HAL 進行。修改某個插槽的一部分的區隔時,Bootloader 會清除「已成功啟動」並重設該插槽的重試次數。

系統啟動載入程式也應決定要載入哪個插槽。圖表顯示決策程序的範例。

系統啟動載入程式排程流程
圖 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 更新的裝置上支援 OTA 更新 (請參閱「不支援 A/B 更新的裝置」),請確認裝置的引導程式符合下列條件。

  • recovery 分區應包含可從某些支援的分區 (cacheuserdata) 讀取系統映像檔,並將其寫入 system 分區的映像檔。

  • 系統啟動載入程式應支援直接啟動至復原模式。

  • 如果支援無線電圖像更新功能,recovery 分割區也應可刷新無線電。您可以透過下列任一方式完成這項操作:

    • 系統啟動載入程式會閃爍無線電。在這種情況下,您應該可以從復原分割區重新啟動至系統啟動載入程式,以便完成更新。

    • 復原映像檔會閃爍無線電。這項功能可提供為二進位程式庫或公用程式。