Fastboot là tên của một mô-đun và chế độ trình tải khởi động. Android 10 trở lên hỗ trợ các phân vùng có thể thay đổi kích thước bằng cách di dời quá trình triển khai fastboot từ trình tải khởi động sang không gian người dùng. Việc di dời này cho phép di chuyển mã nhấp nháy vào một vị trí chung có thể duy trì và kiểm thử, chỉ với các phần dành riêng cho nhà cung cấp của fastboot do một lớp trừu tượng phần cứng (HAL) triển khai. Ngoài ra, Android 12 trở lên hỗ trợ việc flash ramdisk thông qua một lệnh fastboot được thêm vào.
Thống nhất chế độ khởi động nhanh và chế độ khôi phục
Vì fastboot và chế độ khôi phục không gian người dùng tương tự nhau, nên bạn có thể hợp nhất chúng thành một phân vùng hoặc tệp nhị phân. Điều này mang lại những lợi ích như sử dụng ít dung lượng hơn, có ít phân vùng hơn và fastboot cũng như chế độ khôi phục chia sẻ nhân và thư viện.
Fastbootd là tên của một chế độ và trình nền không gian người dùng.
Để hỗ trợ fastbootd
, trình tải khởi động phải triển khai một lệnh khối điều khiển khởi động (BCB) mới của boot-fastboot
. Để chuyển sang chế độ fastbootd
, trình tải khởi động sẽ ghi boot-fastboot
vào trường lệnh của thông báo BCB và giữ nguyên trường recovery
của BCB (để cho phép khởi động lại mọi tác vụ khôi phục bị gián đoạn). Các trường status
, stage
và reserved
cũng không thay đổi.
Trình tải khởi động sẽ tải và khởi động vào hình ảnh khôi phục khi thấy boot-fastboot
trong trường lệnh BCB. Sau đó, Recovery sẽ phân tích cú pháp thông báo BCB và chuyển sang chế độ fastbootd
.
Lệnh ADB
Phần này mô tả lệnh adb
để tích hợp fastbootd
. Lệnh này có nhiều kết quả, tuỳ thuộc vào việc lệnh được thực thi bởi hệ thống hay bởi chế độ khôi phục.
Lệnh | Mô tả |
---|---|
reboot fastboot |
|
Lệnh Fastboot
Phần này mô tả các lệnh fastboot để tích hợp fastbootd
, bao gồm cả các lệnh mới để flash và quản lý các phân vùng logic. Một số lệnh có kết quả khác nhau, tuỳ thuộc vào việc lệnh đó được thực thi bởi trình tải khởi động hay bởi fastbootd
.
Lệnh | Mô tả |
---|---|
reboot recovery |
|
reboot fastboot |
Khởi động lại vào fastbootd . |
getvar is-userspace |
|
getvar is-logical:<partition> |
Trả về yes nếu phân vùng đã cho là một phân vùng logic, nếu không thì trả về no .
Phân vùng logic hỗ trợ tất cả các lệnh được liệt kê bên dưới. |
getvar super-partition-name |
Trả về tên của phân vùng chính. Tên này bao gồm hậu tố khe cắm hiện tại nếu phân vùng cấp cao là phân vùng A/B (thường thì không). |
create-logical-partition <partition> <size> |
Tạo một phân vùng logic có tên và kích thước đã cho. Tên này không được tồn tại dưới dạng một phân vùng logic. |
delete-logical-partition <partition> |
Xoá phân vùng logic đã cho (xoá phân vùng một cách hiệu quả). |
resize-logical-partition <partition> <size> |
Đổi kích thước phân vùng logic thành kích thước mới mà không thay đổi nội dung của phân vùng. Thất bại nếu không đủ dung lượng để thực hiện thao tác đổi kích thước. |
flash <partition> [ <filename> ] |
Ghi một tệp vào phân vùng flash. Thiết bị phải ở trạng thái đã mở khoá. |
erase <partition> |
Xoá một phân vùng (không bắt buộc phải xoá an toàn). Thiết bị phải ở trạng thái chưa khoá. |
getvar <variable> | all |
Hiển thị một biến của trình tải khởi động hoặc tất cả các biến. Nếu biến không tồn tại, hàm sẽ trả về lỗi. |
set_active <slot> |
Đặt khe khởi động A/B đã cho thành Đối với chế độ hỗ trợ A/B, các ngăn xếp là các tập hợp phân vùng trùng lặp có thể khởi động độc lập. Các ô có tên là |
reboot |
Khởi động lại thiết bị theo cách thông thường. |
reboot-bootloader (hoặc reboot bootloader ) |
Khởi động lại thiết bị ở trình tải khởi động. |
fastboot fetch vendor_boot <out.img> |
Sử dụng trong Android 12 trở lên để hỗ trợ vendor ramdisk nhấp nháy.
Lấy toàn bộ kích thước phân vùng và kích thước khối. Nhận dữ liệu cho từng khối, sau đó ghép dữ liệu lại với nhau thành
Để biết thông tin chi tiết, hãy xem |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
Sử dụng trong Android 12 trở lên để hỗ trợ việc ghi đè ramdisk của nhà cung cấp. Đây là một biến thể đặc biệt của lệnh flash. Hàm này thực hiện một hàm hình ảnh
Để biết thông tin chi tiết, hãy xem |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Sử dụng trong Android 12 trở lên để hỗ trợ việc ghi đè ramdisk của nhà cung cấp. Tìm nạp hình ảnh Để biết thông tin chi tiết, hãy xem
|
Chế độ khởi động nhanh và trình tải khởi động
Trình tải khởi động sẽ flash các phân vùng bootloader
, radio
và boot/recovery
, sau đó thiết bị sẽ khởi động vào fastboot (không gian người dùng) và flash tất cả các phân vùng khác. Trình tải khởi động phải hỗ trợ các lệnh sau.
Lệnh | Mô tả |
---|---|
download |
Tải hình ảnh xuống bộ nhớ flash. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Nạp phân vùng recovery/boot và trình tải khởi động. |
reboot |
Khởi động lại thiết bị. |
reboot fastboot |
Khởi động lại ở chế độ khởi động nhanh. |
reboot recovery |
Khởi động lại để khôi phục. |
getvar |
Nhận một biến trình tải khởi động cần thiết để flash hình ảnh khôi phục/khởi động (ví dụ: current-slot và max-download-size ). |
oem <command> |
Lệnh do OEM xác định. |
Phân vùng động
Trình tải khởi động không được cho phép ghi hoặc xoá các phân vùng động và phải trả về lỗi nếu các thao tác này được thực hiện. Đối với các thiết bị phân vùng động được trang bị thêm, công cụ fastboot (và trình tải khởi động) hỗ trợ chế độ bắt buộc để cài đặt ROM trực tiếp một phân vùng động trong khi ở chế độ trình tải khởi động. Ví dụ: nếu system
là một phân vùng động trên thiết bị được trang bị thêm, thì việc sử dụng lệnh fastboot --force flash system
sẽ cho phép trình tải khởi động (thay vì fastbootd
) cài đặt phân vùng.
Sạc ở chế độ tắt
Nếu một thiết bị hỗ trợ chế độ sạc khi tắt nguồn hoặc tự động khởi động vào một chế độ đặc biệt khi được cắm nguồn, thì việc triển khai lệnh fastboot oem off-mode-charge 0
phải bỏ qua các chế độ đặc biệt này để thiết bị khởi động như thể người dùng đã nhấn nút nguồn.
HAL OEM khởi động nhanh
Để thay thế hoàn toàn fastboot của trình tải khởi động, fastboot phải xử lý tất cả các lệnh fastboot hiện có. Nhiều lệnh trong số này là của OEM và được ghi lại nhưng yêu cầu phải triển khai tuỳ chỉnh. Nhiều lệnh dành riêng cho OEM không được ghi lại. Để xử lý các lệnh như vậy, HAL fastboot chỉ định các lệnh OEM bắt buộc. Các OEM cũng có thể triển khai các lệnh của riêng họ.
Định nghĩa về HAL fastboot như sau:
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);
};
Bật fastbootd
Cách bật fastbootd
trên thiết bị:
Thêm
fastbootd
vàoPRODUCT_PACKAGES
trongdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Đảm bảo rằng HAL fastboot, HAL kiểm soát quá trình khởi động và HAL sức khoẻ được đóng gói trong hình ảnh khôi phục.
Thêm mọi quyền SEPolicy dành riêng cho thiết bị mà
fastbootd
yêu cầu. Ví dụ:fastbootd
yêu cầu quyền ghi vào một phân vùng dành riêng cho thiết bị để flash phân vùng đó. Ngoài ra, việc triển khai HAL fastboot cũng có thể yêu cầu các quyền dành riêng cho thiết bị.
Để xác thực quy trình fastboot không gian người dùng, hãy chạy Bộ thử nghiệm của nhà cung cấp (VTS).
Ramdisk của nhà cung cấp Flash
Android 12 trở lên hỗ trợ việc nạp ramdisk bằng một lệnh fastboot được thêm vào để kéo hình ảnh vendor_boot
đầy đủ từ một thiết bị. Lệnh này nhắc công cụ fastboot phía máy chủ đọc tiêu đề khởi động của nhà cung cấp, tạo lại hình ảnh và flash hình ảnh mới.
Để kéo hình ảnh vendor_boot
đầy đủ, lệnh fetch:vendor_boot
đã được thêm vào cả giao thức fastboot và quá trình triển khai fastbootd của giao thức này trong Android 12. Xin lưu ý rằng fastbootd có triển khai tính năng này, nhưng chính trình tải khởi động có thể không triển khai. OEM có thể thêm lệnh fetch:vendor_boot
vào quá trình triển khai trình tải khởi động của giao thức. Tuy nhiên, nếu lệnh không được nhận dạng ở chế độ bộ nạp khởi động, thì việc flash ramdisk riêng lẻ của nhà cung cấp ở chế độ bộ nạp khởi động không phải là lựa chọn được nhà cung cấp hỗ trợ.
Các thay đổi về trình tải khởi động
Các lệnh getvar:max-fetch-size
và fetch:name
được triển khai trong fastbootd
. Để hỗ trợ việc flash ramdisk của nhà cung cấp trong trình tải khởi động, bạn phải triển khai 2 lệnh này.
Các thay đổi về fastbootd
getvar:max-fetch-size
tương tự như max-download-size
. Tham số này chỉ định kích thước tối đa mà thiết bị có thể gửi trong một phản hồi DATA. Trình điều khiển không được tìm nạp kích thước lớn hơn giá trị này.
fetch:name[:offset[:size]]
thực hiện một loạt các bước kiểm tra trên thiết bị. Nếu tất cả các điều kiện sau đều đúng, thì lệnh fetch:name[:offset[:size]]
sẽ trả về dữ liệu:
- Thiết bị đang chạy một bản dựng có thể gỡ lỗi.
- Thiết bị đã mở khoá (trạng thái khởi động màu cam).
- Tên phân vùng được tìm nạp là
vendor_boot
. - Giá trị
size
nằm trong khoảng 0 <size
<=max-fetch-size
.
Khi các thông tin này được xác minh, fetch:name[:offset[:size]]
sẽ trả về kích thước và độ lệch của phân vùng.
Xin lưu ý những điều sau:
fetch:name
tương đương vớifetch:name:0
, tương đương vớifetch:name:0:partition_size
.fetch:name:offset
tương đương vớifetch:name:offset:(partition_size - offset)
Do đó, fetch:name[:offset[:size]]
= fetch:name:offset:(partition_size - offset)
.
Khi offset
hoặc partition_size
(hoặc cả hai) không được chỉ định, các giá trị mặc định sẽ được sử dụng, trong đó offset
là 0 và size
là giá trị được tính của partition_size - offset
.
- Đã chỉ định độ lệch, chưa chỉ định kích thước:
size = partition_size - offset
- Không chỉ định: sử dụng giá trị mặc định cho cả hai,
size = partition_size
– 0.
Ví dụ: fetch:foo
tìm nạp toàn bộ phân vùng foo
ở độ lệch 0.
Thay đổi người lái xe
Các lệnh đã được thêm vào công cụ fastboot để triển khai các thay đổi về trình điều khiển. Mỗi lệnh đều được liên kết với định nghĩa đầy đủ trong bảng các lệnh Fastboot.
fastboot fetch vendor_boot out.img
- Gọi
getvar max-fetch-size
để xác định kích thước khối. - Gọi
getvar partition-size:vendor_boot[_a]
để xác định kích thước của toàn bộ phân vùng. - Gọi
fastboot fetch vendor_boot[_a]:offset:size
cho mỗi đoạn. (Kích thước của đoạn lớn hơn kích thướcvendor_boot
, nên thường chỉ có một đoạn.) - Kết hợp dữ liệu với nhau, thành
out.img
.
- Gọi
fastboot flash vendor_boot:default vendor-ramdisk.img
Đây là một biến thể đặc biệt của lệnh flash. Thao tác này sẽ tìm nạp hình ảnh
vendor_boot
, như thểfastboot fetch
đã được gọi.- Nếu quá trình khởi động của nhà cung cấp là tiêu đề phiên bản 3, thì quá trình này sẽ thực hiện những việc sau:
- Thay thế ramdisk của nhà cung cấp bằng hình ảnh đã cho.
- Nhấp nháy hình ảnh
vendor_boot
mới.
- Nếu tiêu đề khởi động của nhà cung cấp là phiên bản 4, thì tiêu đề này sẽ thực hiện những việc sau:
- Thay thế toàn bộ ổ đĩa RAM của nhà cung cấp bằng hình ảnh đã cho để hình ảnh đã cho trở thành phân đoạn ổ đĩa RAM duy nhất của nhà cung cấp trong hình ảnh
vendor_boot
. - Tính toán lại kích thước và độ lệch trong bảng ramdisk của nhà cung cấp.
- Nhấp nháy hình ảnh
vendor_boot
mới.
- Thay thế toàn bộ ổ đĩa RAM của nhà cung cấp bằng hình ảnh đã cho để hình ảnh đã cho trở thành phân đoạn ổ đĩa RAM duy nhất của nhà cung cấp trong hình ảnh
- Nếu quá trình khởi động của nhà cung cấp là tiêu đề phiên bản 3, thì quá trình này sẽ thực hiện những việc sau:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Tìm nạp
vendor_boot image
, như thểfastboot fetch
đã được gọi.- Nếu tiêu đề khởi động của nhà cung cấp là phiên bản 3, thì hàm này sẽ trả về lỗi.
Nếu tiêu đề khởi động của nhà cung cấp là phiên bản 4, thì tiêu đề này sẽ thực hiện những việc sau:
- Tìm phân vùng ramdisk của nhà cung cấp có tên
ramdisk_<var><foo></var>
. Nếu không tìm thấy hoặc nếu có nhiều kết quả trùng khớp, hàm này sẽ trả về lỗi. - Thay thế phân mảnh ramdisk của nhà cung cấp bằng hình ảnh đã cho.
- Tính toán lại từng kích thước và độ lệch trong bảng ramdisk của nhà cung cấp.
- Nhấp nháy hình ảnh
vendor_boot
mới.
- Tìm phân vùng ramdisk của nhà cung cấp có tên
Nếu bạn không chỉ định <foo>, thì hệ thống sẽ cố gắng tìm
ramdisk_
.
mkbootimg
Tên default
được dành riêng để đặt tên cho các phân mảnh ramdisk của nhà cung cấp trong Android 12 trở lên. Mặc dù ngữ nghĩa fastboot flash vendor_boot:default
vẫn giữ nguyên, nhưng bạn không được đặt tên cho các mảnh ramdisk là default
.
Thay đổi về SELinux
Đã có thay đổi trong fastbootd.te
để hỗ trợ việc flash ramdisk của nhà cung cấp.