Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

將Fastboot移至用戶空間

Android 10及更高版本通過將快速引導實現從引導加載程序重新定位到用戶空間來支持可調整大小的分區。通過這種重定位,僅通過硬件抽象層(HAL)實現的快速引導的供應商特定部分,就可以將閃存代碼移動到可維護且可測試的公共位置。

統一快速啟動和恢復

因為用戶空間的快速啟動和恢復是相似的,所以可以將它們合併到一個分區/二進製文件中。優點包括更少的空間使用和總體上更少的分區,以及快速啟動和恢復以共享其內核和庫的能力。

為了支持fastbootd ,引導加載程序必須實現新的boot-fastboot引導控制塊(BCB)命令。進入fastbootd模式,引導程序應該寫boot-fastboot到BCB消息的命令字段和離開recovery BCB不變的字段(啟用中斷恢復任務重新啟動)。 statusstagereserved字段也保持不變。在BCB命令中看到boot-fastboot ,期望引導加載程序加載並引導到恢復映像中。恢復然後解析BCB消息並切換到fastbootd模式。

ADB命令

本節介紹用於集成fastbootdadb命令。該命令具有不同的行為,具體取決於系統還是恢復執行命令。

命令描述
reboot fastboot
  • 重新引導進入fastbootd (系統)。
  • 直接輸入fastbootd ,而無需重新引導(恢復)。

快速啟動命令

本節介紹用於集成fastbootd的fastboot命令,包括用於刷新和管理邏輯分區的新命令。某些命令的行為不同,具體取決於引導加載程序還是fastbootd執行命令。

命令描述
reboot recovery
  • 重新引導進入恢復(引導加載程序)。
  • 直接進入恢復而無需重新引導( fastbootd )。
reboot fastboot重新引導進入fastbootd
getvar is-userspace
  • 返回yesfastbootd )。
  • 返回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> ]將文件寫入閃存分區。設備必須處於解鎖狀態。
erase <partition>擦除分區(不需要進行安全擦除)。設備必須處於解鎖狀態。
getvar <variable> | all顯示引導加載程序變量或所有變量。如果變量不存在,則返回錯誤。
set_active <slot>

將給定的A / B引導插槽設置為active 。在下一次引導嘗試時,系統將從指定的插槽引導。

為了獲得A / B支持,插槽是可重複啟動的一組分區,可以獨立啟動。插槽名為ab等,並通過在分區名稱中添加後綴_a_b等來區分。

reboot正常重啟設備。
reboot-bootloader (或reboot bootloader將設備重新引導到引導加載程序中。

Fastboot和Bootloader

引導加載程序會bootloaderradioboot/recovery分區,然後設備會引導進入fastboot(用戶空間)並刷新所有其他分區。引導加載程序應支持以下命令。

命令描述
download將圖像下載到閃存。
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/刷新recovery/boot分區和引導加載程序。
reboot重新啟動設備。
reboot fastboot重新啟動到快速啟動。
reboot recovery重新啟動以恢復。
getvar獲取刷新恢復/引導映像所需的引導加載程序變量(例如, current-slotmax-download-size )。
oem <command> OEM定義的命令。

動態分區

引導加載程序必須不允許刷新或擦除動態分區,並且如果嘗試執行這些操作,則必須返回錯誤。對於改裝的動態分區設備,fastboot工具(和bootloader)支持強制模式,以在bootloader模式下直接刷新動態分區。例如,如果system是翻新設備上的動態分區,則使用fastboot --force flash system允許引導加載程序刷新分區而不是fastbootd

關模式充電

如果設備支持關閉模式充電,或者在加電時以其他方式自動引導進入特殊模式,則fastboot oem off-mode-charge 0命令應繞過這些特殊模式,並且設備應像用戶按下電源按鈕一樣引導。

Fastboot OEM HAL

要完全替換bootloader fastboot,fastboot必須處理所有現有的fastboot命令。這些命令中有許多來自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 oemCmdArgs 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. device.mk中將fastbootd添加到PRODUCT_PACKAGESPRODUCT_PACKAGES += fastbootd

  2. 確保將fastboot HAL,啟動控制HAL和運行狀況HAL打包為恢復映像的一部分。

  3. 添加fastbootd所需的任何特定於設備的SEPolicy權限。例如, fastbootd要求對特定於設備的分區具有寫訪問權,以刷新該分區。此外,fastboot HAL實施可能還需要特定於設備的權限。

要驗證用戶空間快速啟動,請運行供應商測試套件(VTS)