Android 10 trở lên hỗ trợ các phân vùng có thể đổi kích thước bằng cách chuyển vị trí triển khai tính năng khởi động nhanh từ trình tải khởi động sang không gian người dùng. Việc định vị lại này cho phép di chuyển mã nhấp nháy vào một vị trí chung có thể bảo trì và kiểm thử, chỉ với các phần dành riêng cho nhà cung cấp của tính năng khởi động nhanh được triển khai bằng một lớp trừu tượng phần cứng (HAL). Ngoài ra, Android 12 trở lên hỗ trợ việc cài đặt ROM ổ đĩa thông qua lệnh khởi động nhanh bổ sung.
Hợp nhất tính năng khởi động nhanh và khôi phục
Vì tính năng khởi động nhanh và khôi phục cho không gian người dùng là tương tự nhau, nên bạn có thể hợp nhất các công cụ này thành một phân vùng hoặc tệp nhị phân. Điều này mang lại các ưu điểm như sử dụng ít dung lượng hơn, tổng thể có ít phân vùng hơn, đồng thời có tính năng khởi động nhanh và khôi phục chia sẻ hạt nhân và thư viện.
Để 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 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 đó, dữ liệu khôi phục 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 sẽ cho ra các kết quả khác nhau, tuỳ thuộc vào việc lệnh đó do hệ thống thực thi hay bằng cách khôi phục.
Lệnh | Nội dung mô tả |
---|---|
reboot fastboot |
|
Lệnh khởi động nhanh
Phần này mô tả các lệnh khởi động nhanh để tích hợp fastbootd
, bao gồm cả các lệnh mới để cài đặt ROM và quản lý phân vùng logic. Một số lệnh có kết quả khác nhau, tuỳ thuộc vào việc các lệnh đó do trình tải khởi động thực thi hay do fastbootd
thực thi.
Lệnh | Nội dung 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à phân vùng logic, nếu không thì trả về no .
Phân vùng logic hỗ trợ tất 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 cấp cao. Tên bao gồm hậu tố vị trí hiện tại nếu phân vùng cấp cao là phân vùng A/B (thường không phải như vậy). |
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 không được tồn tại dưới dạng phân vùng logic. |
delete-logical-partition <partition> |
Xoá phân vùng logic đã cho (xoá sạch 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. Không thực hiện được thao tác đổi kích thước nếu không có đủ không gian để thực hiện việc đổi kích thước. |
update-super <partition> |
Hợp nhất các thay đổi đối với siêu dữ liệu của phân vùng cấp cao. Nếu không thể hợp nhất (ví dụ: định dạng trên thiết bị là một phiên bản không được hỗ trợ), thì lệnh này sẽ không thành công. Tham số wipe không bắt buộc sẽ ghi đè siêu dữ liệu của thiết bị, thay vì hợp nhất. |
flash <partition> [ <filename> ] |
Ghi một tệp vào một 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 để xoá an toàn). Thiết bị phải ở trạng thái đã mở khoá. |
getvar <variable> | all |
Cho thấy một biến 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ệ thống sẽ trả về một lỗi. |
set_active <slot> |
Đặt khe khởi động A/B đã cho thành Để hỗ trợ A/B, ô là các tập hợp phân vùng trùng lặp có thể khởi động
một cách độc lập. Các ô được đặt tên là |
reboot |
Khởi động lại thiết bị như bình thường. |
reboot-bootloader (hoặc reboot bootloader ) |
Khởi động lại thiết bị vào trình tải khởi động. |
fastboot fetch vendor_boot <out.img> |
Dùng trong Android 12 trở lên để hỗ trợ cài đặt ROM cho ổ đĩa ram của nhà cung cấp.
Lấy toàn bộ kích thước phân vùng và kích thước phân đoạn. Lấy dữ liệu cho từng đoạn, 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ợ cài đặt ROM ổ đĩa ram của nhà cung cấp. Đây là một biến thể đặc biệt của lệnh flash. Phương thức này thực hiện 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ợ cài đặt ROM ổ đĩa ram của nhà cung cấp. Tìm nạp hình ảnh Để biết thông tin chi tiết, hãy xem
|
Khởi động nhanh và trình tải khởi động
Trình tải khởi động sẽ cài đặt ROM các phân vùng bootloader
, radio
và boot/recovery
, sau đó thiết bị khởi động vào tính năng khởi động nhanh (không gian người dùng) và cài đặt ROM cho 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 | Nội dung mô tả |
---|---|
download |
Tải hình ảnh xuống để cài đặt ROM. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Cài đặt ROM phân vùng và trình tải khởi động recovery/boot . |
reboot |
Khởi động lại thiết bị. |
reboot fastboot |
Khởi động lại bằng chế độ khởi động nhanh. |
reboot recovery |
Khởi động lại để khôi phục. |
getvar |
Lấy một biến trình tải khởi động cần thiết để cài đặt ROM 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 cài đặt ROM hoặc xoá các phân vùng động và phải trả về lỗi nếu cố gắng thực hiện các thao tác này. Đối với các thiết bị phân vùng động được trang bị thêm, công cụ khởi động nhanh (và trình tải khởi động) hỗ trợ chế độ buộc cài đặt ROM trực tiếp một phân vùng động 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 ROM phân vùng.
Sạc ở chế độ tắt
Nếu thiết bị hỗ trợ tính năng sạc ở chế độ tắt hoặc tự động khởi động ở một chế độ đặc biệt khi cấp 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 (Lớp trừu tượng phần cứng) cho quá trình khởi động nhanh
Để thay thế hoàn toàn tính năng khởi động nhanh của trình tải khởi động, tính năng khởi động nhanh phải xử lý tất cả các lệnh khởi động nhanh hiện có. Nhiều lệnh trong số này đến từ nhà sản xuất thiết bị gốc (OEM) và được ghi lại trong tài liệu nhưng yêu cầu 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 khởi động nhanh chỉ định các lệnh OEM bắt buộc. OEM cũng có thể triển khai lệnh của riêng mình.
Sau đây là định nghĩa về HAL khởi động nhanh:
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 chế độ khởi động nhanh
Cách bật fastbootd
trên một thiết bị:
Thêm
fastbootd
vàoPRODUCT_PACKAGES
trongdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Đảm bảo rằng HAL khởi động nhanh, HAL điều khiển khởi động và HAL tình trạng được đóng gói trong hình ảnh khôi phục.
Thêm mọi quyền SEPolicy cụ thể theo thiết bị do
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ị để cài đặt ROM phân vùng đó. Ngoài ra, việc triển khai lớp trừu tượng phần cứng (HAL) cho quá trình khởi động nhanh cũng có thể yêu cầu các quyền dành riêng cho thiết bị.
Để xác thực tính năng khởi động nhanh cho không gian người dùng, hãy chạy Bộ thử nghiệm dành cho nhà cung cấp (VTS).
Ổ đĩa flash của nhà cung cấp flash
Android 12 trở lên hỗ trợ việc cài đặt ROM vào ổ đĩa cứng bằng lệnh khởi động nhanh bổ sung để kéo hình ảnh vendor_boot
đầy đủ từ một thiết bị. Lệnh này sẽ nhắc công cụ khởi động nhanh phía máy chủ đọc tiêu đề khởi động của nhà cung cấp, chụp lại hình ảnh và cài đặt ROM 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 khởi động nhanh và phương thức triển khai khởi động nhanh của giao thức này trong Android 12. Xin lưu ý rằng chế độ khởi động nhanh có triển khai thao tác này, nhưng trình tải khởi động có thể thì không. OEM có thể thêm lệnh fetch:vendor_boot
vào phương thức triển khai trình tải khởi động của giao thức. Tuy nhiên, nếu không nhận dạng được lệnh này ở chế độ trình tải khởi động, thì việc cài đặt ROM vào từng ổ đĩa của nhà cung cấp ở chế độ trình tải khởi động sẽ không được nhà cung cấp hỗ trợ.
Các thay đổi đối với 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 cài đặt ROM ổ đĩa cứng của nhà cung cấp trong trình tải khởi động, bạn phải triển khai 2 lệnh sau.
Các thay đổi về chế độ khởi động nhanh
getvar:max-fetch-size
tương tự như max-download-size
. Thuộc tính 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 (DỮ LIỆU). 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]]
sẽ 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 đây đều đúng, 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 những giá trị 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 bạn không chỉ định offset
hoặc partition_size
(hoặc cả hai), các giá trị mặc định sẽ được sử dụng, giá trị này cho offset
là 0 và cho size
là giá trị được tính của partition_size - offset
.
- Đã chỉ định chênh lệch, kích thước không được chỉ định:
size = partition_size - offset
- Không được chỉ định: giá trị mặc định được sử dụng 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ụ khởi động nhanh để triển khai những thay đổi về trình điều khiển. Mỗi loại sẽ được liên kết với định nghĩa đầy đủ trong bảng Lệnh khởi động nhanh.
fastboot fetch vendor_boot out.img
- Gọi
getvar max-fetch-size
để xác định kích thước phân đoạn. - 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 phân đoạn lớn hơn kích thướcvendor_boot
nên thường chỉ có một phân đoạn.) - Ghép dữ liệu lại 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. Phương thức này tìm nạp hình ảnh
vendor_boot
như thểfastboot fetch
được gọi.- Nếu quy trình khởi động của nhà cung cấp là tiêu đề phiên bản 3, thì hệ thống sẽ thực hiện như sau:
- Thay thế ổ đĩa ram 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 đề đó sẽ như sau:
- Thay thế toàn bộ ramdisk của nhà cung cấp bằng hình ảnh đã cho để hình ảnh đó trở thành mảnh ramdisk 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 ổ đĩa cứng của nhà cung cấp.
- Nhấp nháy hình ảnh
vendor_boot
mới.
- Thay thế toàn bộ ramdisk của nhà cung cấp bằng hình ảnh đã cho để hình ảnh đó trở thành mảnh ramdisk duy nhất của nhà cung cấp trong hình ảnh
- Nếu quy trình khởi động của nhà cung cấp là tiêu đề phiên bản 3, thì hệ thống sẽ thực hiện như 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ì tiêu đề sẽ trả về lỗi.
Nếu tiêu đề khởi động của nhà cung cấp là phiên bản 4, sẽ có những nội dung sau:
- Tìm mảnh ramdisk của nhà cung cấp có tên
foo
. Nếu không tìm thấy hoặc nếu có nhiều kết quả trùng khớp, hàm sẽ trả về một lỗi. - Thay thế 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 ổ đĩa cứng của nhà cung cấp.
- Nhấp nháy hình ảnh
vendor_boot
mới.
- Tìm mảnh ramdisk của nhà cung cấp có tên
mkbootimg
Tên default
được dành riêng để đặt tên cho các mảnh ramdisk của nhà cung cấp trong Android 12 trở lên. Mặc dù ngữ nghĩa flash vendor_boot:default
khởi động nhanh 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 SELinux
Chúng tôi đã thực hiện một thay đổi trong
fastbootd.te
để hỗ trợ cài đặt ROM ổ đĩa ram của nhà cung cấp.