實作 OTA 更新

如要實作無線 (OTA) 更新,系統啟動載入程式必須能夠在開機期間存取復原 RAM 磁碟。如果裝置使用未經修改的 Android 開放原始碼計畫復原映像檔,系統啟動載入程式會讀取 misc 分區上的前 32 個位元組;如果資料符合 boot-recovery,系統啟動載入程式會啟動至 recovery 映像檔中。這個方法可讓任何待處理的復原工作 (例如套用 OTA 或移除資料) 繼續執行。

如要進一步瞭解復原作業和系統啟動載入程式用於通訊的 Flash 區塊內容,請參閱 bootable/recovery/bootloader_message/bootloader_message.h

搭載 A/B 更新的裝置

如要在使用 A/B 更新的裝置上支援 OTA 更新,請確認裝置系統啟動載入程式符合下列條件。

一般條件

  • 透過 OTA 更新的所有分區都必須在主要系統啟動時更新 (而非在復原程序中更新)。

  • 為了啟動 system 分區,系統啟動載入程式會在核心指令列中傳遞下列值:ro root=/dev/[node] rootwait init=/init

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

支援啟動控制項 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 設定這項屬性。

  • 透過 setActiveBootSlot 回呼或使用 fastboot set_active 指令,slot-retry-count 值會重設為正值 (通常是 3),修改運算單元的分區時,系統啟動載入程式會清除「成功啟動」並重設該運算單元的重試次數。

此外,系統啟動載入程式也必須決定要載入的運算單元。上圖是決策過程的範例。

系統啟動載入程式插槽流程
圖 1. 系統啟動載入程式配置流程
  1. 決定要嘗試的運算單元。請勿嘗試載入標示為 slot-unbootable 的運算單元。此運算單元應與 Quickboot 傳回的值一致,且稱為目前的運算單元。

  2. 如果目前的運算單元未標示為 slot-successful,且具有 slot-retry-count = 0,請將目前的版位標示為 slot-unbootable。接著,選取未標示為 unbootable 且標示為 slot-successful 的其他版位,這個版位現在是所選的版位。如果目前沒有可用的運算單元,請啟動復原程序,或向使用者顯示有意義的錯誤訊息。

  3. 選取適當的 boot.img,並在核心指令列中加入正確的系統分區路徑。

  4. 填入核心指令列 slot_suffix 參數。

  5. 啟動。如果未標示 slot-successful,減少 slot-retry-count

執行任何 Flash 指令時,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 分區也應能刷新無線電。可透過以下其中一種方式完成:

    • 系統啟動載入程式會刷新無線電。在這種情況下,應該可以從復原分區重新啟動,並回到系統啟動載入程式完成更新。

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