Di chuyển tính năng khởi động nhanh vào không gian người dùng

Android 10 trở lên hỗ trợ phân vùng có thể đổi kích thước bằng cách di chuyển quy trình triển khai khởi động nhanh từ trình tải khởi động sang không gian người dùng. Chiến dịch này việc di chuyển vị trí cho phép di chuyển mã nhấp nháy vào vị trí chung 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ởi tầng trừu tượng phần cứng (HAL). Ngoài ra, Android 12 hoặc phiên bản cao hơ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 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 thế như sử dụng ít dung lượng hơn, ít phân vùng hơn về tổng thể, đồng thời có tính năng khởi động nhanh và khôi phục chia sẻ nhân hệ điều hành và thư viện.

Để hỗ trợ fastbootd, trình tải khởi động phải triển khai một khối điều khiển khởi động mới (BCB) lệnh boot-fastboot. Để chuyển sang chế độ fastbootd, trình tải khởi động ghi boot-fastboot vào trường lệnh của thông báo BCB và để lại Trường recovery của BCB không thay đổi (để cho phép khởi động lại mọi quá trình khôi phục bị gián đoạn nhiệm vụ). Các trường status, stagereserved 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 sau khi thấy boot-fastboot trong trường lệnh BCB. Khôi phục sau đó 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. Chiến lược phát hành đĩa đơn sẽ cho ra kết quả khác nhau, tuỳ thuộc vào việc lệnh đó được hệ thống thực thi hay bằng cách khôi phục.

Lệnh Mô tả
reboot fastboot
  • Khởi động lại vào fastbootd (hệ thống).
  • Nhập trực tiếp fastbootd mà không cần khởi động lại (khôi phục).

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 lệnh mới để cài đặt ROM và quản lý phân vùng logic. Hơi nhiều các lệnh sẽ có kết quả khác nhau, tuỳ thuộc vào việc chúng có được thực thi bằng trình tải khởi động hoặc bằng fastbootd.

Lệnh Mô tả
reboot recovery
  • Khởi động lại vào mục khôi phục (trình tải khởi động).
  • Trực tiếp khôi phục mà không cần khởi động lại (fastbootd).
reboot fastboot Khởi động lại vào fastbootd.
getvar is-userspace
  • Trả về yes (fastbootd).
  • Trả về no (trình tải khởi động).
getvar is-logical:<partition> Trả về yes nếu phân vùng đã cho là phân vùng logic, no nếu không. 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 này bao gồm vùng 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 phép đã 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ành công nếu không có đủ không gian để thực hiện đổ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ì không thành công. Một tham số wipe không bắt buộc sẽ ghi đè tham số 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ở khóa.
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 sẽ trả về một lỗi.
set_active <slot>

Đặt khe khởi động A/B đã cho thành active. Vào ngày tiếp theo cố gắng khởi động, hệ thống sẽ khởi động từ khe được chỉ định.

Đối với tính năng hỗ trợ A/B, ô là các tập hợp phân vùng trùng lặp có thể khởi động độc lập. Ô được đặt tên là a, b, v.v. và phân biệt bằng cách thêm các hậu tố _a, _b và tiếp tục đến tên phân vùng.

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 <out.img>

Để biết thông tin chi tiết, hãy xem fastboot fetch vendor_boot <out.img>.

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 fetch vendor_boot, như thể fastboot fetch có tên. Hình ảnh vendor_boot mới nhấp nháy tuỳ thuộc vào việc phiên bản tiêu đề khởi động là phiên bản 3 hoặc phiên bản 4.

Để biết thông tin chi tiết, hãy xem fastboot flash vendor_boot:default <vendor-ramdisk.img>.

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Dùng trong Android 12 trở lên để hỗ trợ cài đặt ROM ổ đĩa cứng của nhà cung cấp.

Tìm nạp hình ảnh vendor_boot. Trả về lỗi nếu nhà cung cấp tiêu đề khởi động là phiên bản 3. Nếu là phiên bản 4, công cụ này sẽ tìm phiên bản chính xác mảnh ramdisk của nhà cung cấp (nếu có). Thao tác này sẽ thay thế nội dung đó bằng hình ảnh được cung cấp, tính lại kích thước và độ lệch, đồng thời cài đặt ROM vendor_boot image mới.

Để biết thông tin chi tiết, hãy xem fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>

Khởi động nhanh và trình tải khởi động

Trình tải khởi động sẽ cài đặt ROM bootloader, radioboot/recovery phân vùng, 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à 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 để 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 cho quá trình khôi phục/khởi động hình ảnh (ví dụ: current-slotmax-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á phân vùng động và phải trả về lỗi nếu các thao tác này được cố gắng thực hiện. Để được tân trang thiết bị phân vùng động, công cụ khởi động nhanh (và trình tải khởi động) hỗ trợ một lực để cài đặt ROM trực tiếp phân vùng động khi ở chế độ trình tải khởi động. Cho ví dụ: nếu system là một phân vùng động trên thiết bị được trang bị thêm, dùng lệnh fastboot --force flash system sẽ bật 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 vào khi áp dụng nguồn, 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 tuỳ chọn khởi động hiện có các lệnh khởi động nhanh. Nhiều lệnh trong số này đến từ OEM và được ghi lại 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 Lệnh của nhà sản xuất thiết bị gốc (OEM). 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ị:

  1. Thêm fastbootd vào PRODUCT_PACKAGES trong device.mk: PRODUCT_PACKAGES += fastbootd.

  2. Đả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 như một phần của hình ảnh khôi phục.

  3. Thêm mọi quyền SEPolicy cụ thể theo thiết bị do fastbootd yêu cầu. Cho 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 HAL (Lớp trừu tượng phần cứng) khởi động nhanh cũng 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ợ nhấp nháy ổ đĩa ram bằng lệnh khởi động nhanh được thêm vào để kéo toàn bộ vendor_boot hình ảnh trên một thiết bị. Lệnh này sẽ nhắc tính năng khởi động nhanh phía máy chủ để đọc tiêu đề khởi động của nhà cung cấp, chỉnh sửa lại và cài đặt ROM hình ảnh mới.

Để lấy hình ảnh đầy đủ vendor_boot, lệnh fetch:vendor_boot đã được thêm vào cho cả giao thức khởi động nhanh lẫn triển khai khởi động nhanh của giao thức trong Android 12. Xin lưu ý rằng tính năng khởi động nhanh triển khai điều này, nhưng bản thân trình tải khởi động có thể thì không. OEM có thể thêm lệnh fetch:vendor_boot để triển khai trình tải khởi động của giao thức. Tuy nhiên, nếu lệnh này không được nhận dạng ở chế độ trình tải khởi động, thì việc cài đặt ROM ổ đĩa của nhà cung cấp cá nhân ở chế độ trình tải khởi động không phải là giải pháp đượ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-sizefetch:name được triển khai trong fastbootd. Để hỗ trợ 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 hai lệnh này.

Các thay đổi về chế độ khởi động nhanh

getvar:max-fetch-size tương tự như max-download-size. Quy tắc 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). Người lái xe 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ả trong các điều kiện sau đây là đú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 phân vùng và bù trừ. Xin lưu ý những điều sau:

  • fetch:name tương đương với fetch:name:0, tương đương với fetch:name:0:partition_size.
  • fetch:name:offset tương đương với fetch: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), giá trị mặc định được sử dụng, cho offset là 0 và cho size là giá trị giá trị sau tính toán là 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 được liên kết với định nghĩa đầy đủ của nó trong bảng 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 nguồn cấp dữ liệu phân đoạn. (Kích thước phân đoạn lớn hơn kích thước vendor_boot, nên thường chỉ có một phần.)
    • Ghép dữ liệu lại với nhau, thành out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Đây là một biến thể đặc biệt của lệnh flash. Nó 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à phiên bản tiêu đề 3, thì sẽ thực hiện những việc 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 nhà cung cấp là phiên bản 4, thì sẽ thực hiện những việc sau:
      • Thay thế toàn bộ ramdisk của nhà cung cấp bằng hình ảnh đã cho để hình ảnh nhất định trở thành mảnh ramdisk duy nhất của nhà cung cấp trong vendor_boot hình ảnh.
      • 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.
  • 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 thì 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.

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. Trong khi flash vendor_boot:default khởi động nhanh ngữ nghĩa vẫn như cũ, bạn không được đặt tên cho các mảnh ramdisk là default.

Thay đổi SELinux

Đã thực hiện thay đổi trong fastbootd.te để hỗ trợ cài đặt ROM ổ đĩa ram của nhà cung cấp.