將 Fastboot 移至使用者空間

Android 10 以上版本支援可調整大小的分區, 將 Fastboot 實作從系統啟動載入程式重新移到使用者空間。這個 重設 - 將刷新程式碼移到可維護且可測試的範圍內 是由 硬體抽象層 (HAL)此外,Android 12 及以上版本支援透過新增的 Fastboot 指令刷新 ramdisks。

統合 Fastboot 與復原

由於使用者空間 Fastboot 與復原類似,因此您可以合併這兩個應用程式 分區或二進位檔這種做法的好處包括可減少空間 以及透過 Fastboot 和復原功能 核心和程式庫

如要支援 fastbootd,系統啟動載入程式必須實作新的啟動控制項區塊 (BCB) 指令boot-fastboot。如要進入fastbootd模式,請啟動系統啟動載入程式 將 boot-fastboot 寫入 BCB 訊息的指令欄位,然後 BCB 的 recovery 欄位不變 (以便重新啟動任何中斷的復原程序) 工作)。statusstagereserved 欄位也維持不變。 系統出現啟動載入程式時,即會載入並啟動還原映像檔, boot-fastboot。復原並剖析 BCB 訊息 並切換至「fastbootd」模式。

ADB 指令

本節說明用於整合 fastbootdadb 指令。 根據執行由系統或執行的操作,會產生不同的結果 也就是復原

指令 說明
reboot fastboot
  • 重新啟動後進入 fastbootd (系統)。
  • 直接在不重新啟動 (復原) 的情況下輸入 fastbootd

Fastboot 指令

本節說明用於整合 fastbootd 的 Fastboot 指令。 包括用於刷新及管理邏輯分區的新指令。只有部分通知 指令會產生不同的結果,具體取決於您是否執行 系統啟動載入程式,或使用 fastbootd 提交。

指令 說明
reboot recovery
  • 重新啟動並進入復原程序 (系統啟動載入程式)。
  • 在不重新啟動的情況下直接進入復原程序 (fastbootd)。
reboot fastboot 重新啟動後進入 fastbootd
getvar is-userspace
  • 傳回 yes (fastbootd)。
  • 傳回 no (系統啟動載入程式)。
getvar is-logical:<partition> 如果指定分區是邏輯分區,則會傳回 yes。 否則為 no。 邏輯分區支援下列所有指令。
getvar super-partition-name 傳回超級分區的名稱。名稱包含目前的運算單元 副檔名為 A/B 分區 (通常不是)。
create-logical-partition <partition> <size> 使用指定的名稱與大小建立邏輯分區。名稱不得 以做為邏輯分區
delete-logical-partition <partition> 刪除指定的邏輯分區 (有效清除分區)。
resize-logical-partition <partition> <size> 在不變更內容的情況下,將邏輯分區調整至新的大小。 如果沒有足夠空間執行大小調整作業,即失敗。
update-super <partition> 合併對超級分區中繼資料所做的變更。如果無法合併 (例如,該裝置上的格式不受支援) 指令失敗。選用的 wipe 參數會覆寫裝置的 而不要執行合併
flash <partition><filename> ] 將檔案寫入 Flash 分區。裝置必須處於解鎖狀態。
erase <partition> 清除分割區 (不需要安全清除)。裝置必須位於 解鎖狀態。
getvar <variable> | all 顯示系統啟動載入程式變數或所有變數。如果變數沒有 存在,則傳回錯誤。
set_active <slot>

將指定的 A/B 啟動運算單元設為 active。未來 當啟動嘗試時,系統會從指定的運算單元啟動。

如果是 A/B 支援,運算單元是可以啟動的重複分區組合 運算單元的名稱為 ab 等等。 加上後置字串 _a_b 和 以此類推

reboot 正常重新啟動裝置。
reboot-bootloader (或reboot bootloader) 重新啟動裝置,並進入系統啟動載入程式。
fastboot fetch vendor_boot <out.img>

適用於 Android 12 以上版本: 支援刷新廠商 ramdisks 功能。

取得整個分區大小和區塊大小。取得每個區塊的資料 然後,這些資料會結合到 <out.img>

詳情請參閱 fastboot fetch vendor_boot <out.img>

fastboot flash vendor_boot:default <vendor-ramdisk.img>

使用 Android 12 以上版本以支援刷新供應商 ramdisks。

這是 Flash 指令的特殊變化版本。這會執行 fetch vendor_boot 圖片函式,就像 fastboot fetch 之前一樣 物件。要刷新的新 vendor_boot 映像檔取決於 開機標頭版本為第 3 版或第 4 版。

詳情請參閱 fastboot flash vendor_boot:default <vendor-ramdisk.img>

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> 適用於 Android 12 以上版本: 支援刷新廠商 ramdisks。

擷取 vendor_boot 圖片。如果供應商發生錯誤,則傳回錯誤 Boot 標頭是第 3 版。如果是第 4 版,會找到 供應商 ramdisk 片段 (如有)。而是以指定的圖片取代 重新計算大小和偏移,並將新的 vendor_boot image 閃爍。

詳情請參閱 fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>敬上

Fastboot 和系統啟動載入程式

系統啟動載入程式會刷新 bootloaderradioboot/recovery 分區,裝置就會以快速開機的方式啟動 (使用者空間) 並閃爍 其他所有分區系統啟動載入程式應支援下列指令。

指令 說明
download 將映像檔下載為 Flash。
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ 刷新 recovery/boot 分區和系統啟動載入程式。
reboot 重新啟動裝置。
reboot fastboot 重新啟動為 Fastboot。
reboot recovery 重新啟動以進行復原。
getvar 取得刷新復原/啟動程序所需的系統啟動載入程式變數 圖片 (例如 current-slotmax-download-size)。
oem <command> 由原始設備製造商 (OEM) 定義的指令。

動態分區

系統啟動載入程式不得允許刷新或清除動態分區 如果嘗試執行這些作業,則必須傳回錯誤。改裝用 動態分區裝置,Fastboot 工具 (和系統啟動載入程式) 支援 模式來直接刷新動態分區。適用對象 舉例來說,如果 system 是更新後裝置上的動態分區, 使用 fastboot --force flash system 指令啟用系統啟動載入程式 (而非 fastbootd) 來刷新分區。

關閉模式充電

支援離線充電或以其他特殊模式自動啟動的裝置 模式將會導入 fastboot oem off-mode-charge 0 指令必須 略過這些特殊模式,讓裝置在開機時就好像已按下使用者一樣 電源鍵。

Fastboot 原始設備製造商 (OEM) HAL

如要完全取代系統啟動載入程式 Fastboot,必須處理所有現有的 Quickboot Quickboot 指令。這些指令中有許多來自原始設備製造商 (OEM) 並已記錄下來, 需要自訂實作許多 OEM 專用的指令「沒有」 。如要處理這類指令,Fastboot HAL 會指定必要的 原始設備製造商 (OEM) 指令。原始設備製造商 (OEM) 也可以導入自己的指令。

Fastboot HAL 的定義如下:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

啟用 Fastbootd

如何在裝置上啟用 fastbootd

  1. 新增 fastbootddevice.mk 中的 PRODUCT_PACKAGESPRODUCT_PACKAGES += fastbootd

  2. 確保 Fastboot HAL、啟動控制 HAL 和健康狀態 HAL 包裝完成 做為復原映像檔的一部分

  3. 新增 fastbootd 要求的任何裝置專屬 SEPolicy 權限。適用對象 舉例來說,fastbootd 需要具備裝置專屬分區的寫入權限,才能 新的 Docker 映像檔此外,Fastboot HAL 實作也可以 並規定裝置會有特定權限

如要驗證使用者空間 Fastboot,請執行供應商測試套件 (VTS)

快閃供應商 ramdisks

Android 12 以上版本支援 使用新增的 Fastboot 指令刷新 ramdisks 裝置中的 vendor_boot 張圖片。這個指令會提示主機端 Fastboot 工具讀取廠商開機標頭、重新映射並刷新新映像檔。

為了提取完整的 vendor_boot 映像檔,新增了 fetch:vendor_boot 指令 快速啟動通訊協定, 在 Android 12 中。請注意,Fastbootd 但系統啟動載入程式本身不一定能實作這個內容。原始設備製造商 (OEM) 可新增 fetch:vendor_boot 指令並導入相應的系統啟動載入程式 因此效能相當卓越不過,如果系統啟動載入程式模式無法辨識該指令,則 在系統啟動載入程式模式下刷新個別廠商 ramdisk 不受供應商支援 如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇

系統啟動載入程式變更

getvar:max-fetch-sizefetch:name 指令會在 fastbootd。如要在系統啟動載入程式中支援刷新廠商 ramdisks,您必須 實作這兩個指令

快速系統啟動變更

getvar:max-fetch-sizemax-download-size 相似。它會指定 裝置可在一個 DATA 回應中傳送的大小上限。駕駛不得 擷取的大小。

fetch:name[:offset[:size]] 會在裝置上執行一系列檢查。如果所有 以下為 true,fetch:name[:offset[:size]] 指令會傳回資料:

  • 裝置正在執行可進行偵錯的版本。
  • 裝置已解鎖 (啟動狀態橘色)。
  • 擷取的分區名稱為 vendor_boot
  • size 值落在 0 <size <= max-fetch-size

驗證這些項目後,fetch:name[:offset[:size]] 會傳回分區大小 和偏移值 注意事項:

  • fetch:name 等於 fetch:name:0,相當於 fetch:name:0:partition_size
  • fetch:name:offset 相當於 fetch:name:offset:(partition_size - offset)

因此 fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

未指定 offsetpartition_size (或兩者) 時, 系統會使用預設值 (offset 為 0),size 則是 計算出來的 partition_size - offset

  • 已指定偏移,未指定大小:size = partition_size - offset
  • 未指定這兩個值:兩者使用的預設值,size = partition_size - 0。

例如,fetch:foo 會在位移 0 擷取整個 foo 分區。

驅動程式變更

指令新增至 Fastboot 工具中,以實作驅動程式變更。每個 連結至 Fastboot 表格中的完整定義 指令

  • fastboot fetch vendor_boot out.img

    • 呼叫 getvar max-fetch-size 來判斷區塊大小。
    • 呼叫 getvar partition-size:vendor_boot[_a] 來判斷 整個分區的大小
    • 針對每個項目呼叫 fastboot fetch vendor_boot[_a]:offset:size 區塊(區塊大小超過 vendor_boot 的大小, 所以通常只有一個區塊)。
    • 將資料拼接至 out.img
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    這是 Flash 指令的特殊變化版本。它會擷取 vendor_boot 圖片,就像呼叫 fastboot fetch 一樣。

    • 如果廠商啟動程序是標頭 3、 它會執行以下作業:
      • 將供應商 ramdisk 更換為指定的映像檔。
      • 刷新新的 vendor_boot 圖片。
    • 如果廠商啟動標頭是 version 4、 它會執行以下作業:
      • 以指定的映像檔取代整個供應商 ramdisk, 提供的映像檔會成為 vendor_boot 張圖片。
      • 重新計算供應商 ramdisk 資料表中的大小和偏移。
      • 刷新新的 vendor_boot 圖片。
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    擷取 vendor_boot image,就像呼叫 fastboot fetch 一樣。

    • 如果廠商開機標頭是第 3 版,就會傳回錯誤。
    • 如果廠商啟動標頭是第 4 版,就會執行以下操作:

      • 尋找名稱為 foo 的廠商 ramdisk 片段。如果找不到,或 如有多個相符項目,則會傳回錯誤。
      • 使用指定圖片取代廠商 ramdisk 片段。
      • 重新計算供應商 ramdisk 資料表中的每個大小和偏移。
      • 刷新新的 vendor_boot 圖片。

mkbootimg

名稱 default 已預留給在 Android 12 以上版本。執行 Fastboot flash vendor_boot:default 時 語意保持不變,您不得將 ramdisk 片段命名為 default

SELinux 變更

變更日期: fastbootd.te敬上 以便支援刷新廠商 ramdisks。