Android 10 以上版本支援可調整大小的分區, 將 Fastboot 實作從系統啟動載入程式重新移到使用者空間。這個 重設 - 將刷新程式碼移到可維護且可測試的範圍內 是由 硬體抽象層 (HAL)此外,Android 12 及以上版本支援透過新增的 Fastboot 指令刷新 ramdisks。
統合 Fastboot 與復原
由於使用者空間 Fastboot 與復原類似,因此您可以合併這兩個應用程式 分區或二進位檔這種做法的好處包括可減少空間 以及透過 Fastboot 和復原功能 核心和程式庫
如要支援 fastbootd
,系統啟動載入程式必須實作新的啟動控制項區塊
(BCB) 指令boot-fastboot
。如要進入fastbootd
模式,請啟動系統啟動載入程式
將 boot-fastboot
寫入 BCB 訊息的指令欄位,然後
BCB 的 recovery
欄位不變 (以便重新啟動任何中斷的復原程序)
工作)。status
、stage
和 reserved
欄位也維持不變。
系統出現啟動載入程式時,即會載入並啟動還原映像檔,
boot-fastboot
。復原並剖析 BCB 訊息
並切換至「fastbootd
」模式。
ADB 指令
本節說明用於整合 fastbootd
的 adb
指令。
根據執行由系統或執行的操作,會產生不同的結果
也就是復原
指令 | 說明 |
---|---|
reboot fastboot |
|
Fastboot 指令
本節說明用於整合 fastbootd
的 Fastboot 指令。
包括用於刷新及管理邏輯分區的新指令。只有部分通知
指令會產生不同的結果,具體取決於您是否執行
系統啟動載入程式,或使用 fastbootd
提交。
指令 | 說明 |
---|---|
reboot recovery |
|
reboot fastboot |
重新啟動後進入 fastbootd 。 |
getvar is-userspace |
|
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 啟動運算單元設為 如果是 A/B 支援,運算單元是可以啟動的重複分區組合
運算單元的名稱為 |
reboot |
正常重新啟動裝置。 |
reboot-bootloader (或reboot bootloader ) |
重新啟動裝置,並進入系統啟動載入程式。 |
fastboot fetch vendor_boot <out.img> |
適用於 Android 12 以上版本: 支援刷新廠商 ramdisks 功能。
取得整個分區大小和區塊大小。取得每個區塊的資料
然後,這些資料會結合到 |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
使用 Android 12 以上版本以支援刷新供應商 ramdisks。 這是 Flash 指令的特殊變化版本。這會執行
詳情請參閱
|
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
適用於 Android 12 以上版本:
支援刷新廠商 ramdisks。 擷取 詳情請參閱
|
Fastboot 和系統啟動載入程式
系統啟動載入程式會刷新 bootloader
、radio
和 boot/recovery
分區,裝置就會以快速開機的方式啟動 (使用者空間) 並閃爍
其他所有分區系統啟動載入程式應支援下列指令。
指令 | 說明 |
---|---|
download |
將映像檔下載為 Flash。 |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
刷新 recovery/boot 分區和系統啟動載入程式。 |
reboot |
重新啟動裝置。 |
reboot fastboot |
重新啟動為 Fastboot。 |
reboot recovery |
重新啟動以進行復原。 |
getvar |
取得刷新復原/啟動程序所需的系統啟動載入程式變數
圖片 (例如 current-slot 和
max-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
:
新增
fastbootd
至device.mk
中的PRODUCT_PACKAGES
:PRODUCT_PACKAGES += fastbootd
。確保 Fastboot HAL、啟動控制 HAL 和健康狀態 HAL 包裝完成 做為復原映像檔的一部分
新增
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-size
和 fetch:name
指令會在
fastbootd
。如要在系統啟動載入程式中支援刷新廠商 ramdisks,您必須
實作這兩個指令
快速系統啟動變更
getvar:max-fetch-size
和 max-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)
。
未指定 offset
或 partition_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
一樣。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。