Di chuyển Fastboot sang không gian người dù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 chuyển quá trình triển khai fastboot từ bộ nạp khởi động sang không gian người dùng. Việc di chuyển này cho phép di chuyển mã flash vào một vị trí chung có thể bảo trì và kiểm tra được chỉ với các phần fastboot dành riêng cho nhà cung cấp được triển khai bởi lớp trừu tượng phần cứng (HAL). Ngoài ra, Android 12 trở lên còn hỗ trợ flash đĩa RAM thông qua lệnh fastboot bổ sung.

Hợp nhất fastboot và recovery

Vì không gian người dùng fastboot và recovery 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 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à có fastboot và recovery chia sẻ kernel và thư viện của chúng.

Để hỗ trợ fastbootd , bộ nạp khởi động phải triển khai lệnh khối điều khiển khởi động (BCB) mới của boot-fastboot . Để vào chế độ fastbootd , bootloader 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 , stagereserved cũng không thay đổi. Bộ nạp khởi động tải và khởi động vào hình ảnh khôi phục khi nhìn thấy boot-fastboot trong trường lệnh BCB. Recovery sau đó phân tích tin nhắn 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 có kết quả khác nhau, tùy thuộc vào việc nó được thực thi bởi hệ thống hay bởi quá trình khôi phục.

Yêu cầu Sự miêu tả
reboot fastboot
  • Khởi động lại vào fastbootd (hệ thống).
  • Vào fastbootd trực tiếp 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 fastboot để tích hợp fastbootd , bao gồm các lệnh mới để flash và quản lý các phân vùng hợp lý. Một số lệnh có kết quả khác nhau, tùy thuộc vào việc chúng được thực thi bởi bootloader hay fastbootd .

Yêu cầu Sự miêu tả
reboot recovery
  • Khởi động lại vào recovery (bootloader).
  • Vào recovery trực tiếp 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 (bộ nạp khởi động).
getvar is-logical: <partition> Trả về yes nếu phân vùng đã cho là phân vùng logic, ngược lại thì no . Các 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 siêu phân vùng. Tên bao gồm hậu tố vị trí hiện tại nếu siêu phân vùng 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 hợp lý với tên và kích thước đã cho. Tên này không được tồn tại dưới dạng phân vùng logic.
delete-logical-partition <partition> Xóa phân vùng logic đã cho (xóa phân vùng một cách hiệu quả).
resize-logical-partition <partition> <size> Thay đổ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 nó. Không thành công nếu không có đủ dung lượng để thực hiện thay đổi kích thước.
update-super <partition> Hợp nhất các thay đổi đối với siêu dữ liệu phân vùng. Nếu không thể hợp nhất (ví dụ: định dạng trên thiết bị là phiên bản không được hỗ trợ) thì lệnh này sẽ không thành công. Tham số wipe tùy chọn sẽ ghi đè siêu dữ liệu của thiết bị thay vì thực hiện hợp nhất.
flash <partition> [ <filename> ] Ghi một tập tin vào một phân vùng flash. Thiết bị phải ở trạng thái mở khóa.
erase <partition> Xóa một phân vùng (không bắt buộc phải xóa an toàn). Thiết bị phải ở trạng thái mở khóa.
getvar <variable> | all Hiển thị biến bootloader hoặc tất cả các biến. Nếu biến không tồn tại, sẽ trả về lỗi.
set_active <slot>

Đặt khe khởi động A/B đã cho là active . Trong lần khởi động tiếp theo, hệ thống khởi động từ khe được chỉ định.

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

reboot Khởi động lại thiết bị bình thường.
reboot-bootloader (hoặc reboot bootloader ) Khởi động lại thiết bị vào bootloader.
fastboot fetch vendor_boot <out.img>

Sử dụng trong Android 12 trở lên để hỗ trợ việc flash đĩ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 chunk. Nhận 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 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ợ việc flash đĩa ram của nhà cung cấp.

Đây là một biến thể đặc biệt của lệnh flash. Nó thực hiện chức năng fetch vendor_boot , như thể fastboot fetch được gọi. Hình ảnh vendor_boot mới mà nó nhấp nháy tùy thuộc vào phiên bản tiêu đề khởi động là phiên bản 3 hay phiên bản 4.

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

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> Sử dụng trong Android 12 trở lên để hỗ trợ việc flash đĩa ram của nhà cung cấp.

Tìm nạp hình ảnh vendor_boot . Trả về lỗi nếu tiêu đề khởi động của nhà cung cấp là phiên bản 3. Nếu là phiên bản 4, nó sẽ tìm đúng đoạn đĩa ram của nhà cung cấp (nếu có). Nó thay thế hình ảnh đó bằng hình ảnh đã cho, tính toán lại kích thước và độ lệch, đồng thời hiển thị vendor_boot image mới.

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

Fastboot và bộ nạp khởi động

Bộ tải khởi động sẽ nhấp nháy các phân vùng bootloader , radioboot/recovery , sau đó thiết bị khởi động vào fastboot (không gian người dùng) và nhấp nháy tất cả các phân vùng khác. Bộ nạp khởi động phải hỗ trợ các lệnh sau.

Yêu cầu Sự miêu tả
download Tải hình ảnh về flash.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Nhấp nháy phân vùng recovery/boot và bộ nạp khởi động.
reboot Khởi động lại thiết bị.
reboot fastboot Khởi động lại vào fastboot.
reboot recovery Khởi động lại để phục hồi.
getvar Nhận một biến bộ nạp khởi động cần thiết để nhấp nháy hình ảnh khôi phục/khởi động (ví dụ: current-slotmax-download-size ).
oem <command> Lệnh được xác định bởi OEM.

Phân vùng động

Bộ tải khởi động không được cho phép nhấp nháy hoặc xóa các phân vùng động và phải trả về lỗi nếu 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ụ fastboot (và bộ nạp khởi động) hỗ trợ chế độ bắt buộc để flash trực tiếp một phân vùng động khi ở chế độ bộ nạp 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, việc sử dụng lệnh fastboot --force flash system sẽ cho phép bộ nạp khởi động (thay vì fastbootd ) flash phân vùng.

Sạc ở chế độ tắt

Nếu một thiết bị hỗ trợ sạc ngoài chế độ hoặc tự động khởi động sang chế độ đặc biệt khi cấp 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.

Fastboot OEM HAL

Để thay thế hoàn toàn bootloader fastboot, 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 triển khai tùy 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, fastboot HAL chỉ định các lệnh OEM cần thiết. OEM cũng có thể thực hiện các lệnh của riêng họ.

Định nghĩa của fastboot HAL 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);

};

Kích hoạt fastbootd

Để bật fastbootd trên thiết bị:

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

  2. Đảm bảo rằng HAL fastboot, HAL kiểm soát khởi động và HAL sức khỏe được đóng gói như một phần của hình ảnh khôi phục.

  3. Thêm bất kỳ quyền SEPolicy dành riêng cho thiết bị nào được yêu cầu bởi fastbootd . Ví dụ: fastbootd yêu cầu quyền ghi vào 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 fastboot HAL cũng có thể yêu cầu các quyền dành riêng cho thiết bị.

Để xác thực fastboot không gian người dùng, hãy chạy Bộ kiểm tra nhà cung cấp (VTS) .

Đĩa RAM của nhà cung cấp đang nhấp nháy

Android 12 trở lên cung cấp tính năng hỗ trợ flash đĩa RAM bằng lệnh fastboot bổ sung để lấy hình ảnh vendor_boot đầy đủ từ thiết bị. Lệnh sẽ 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 và flash hình ảnh mới.

Để lấy hình ảnh vendor_boot đầy đủ, lệnh fetch:vendor_boot đã được thêm vào cả giao thức fastboot và triển khai giao thức fastbootd trong Android 12. Xin lưu ý rằng fastbootd thực hiện điều này, nhưng bản thân bộ nạp khởi động có thể không thực hiện được. Các OEM có thể thêm lệnh fetch:vendor_boot vào quá trình triển khai giao thức bộ nạp khởi động của họ. 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 từng đĩa ram của nhà cung cấp ở chế độ bộ nạp khởi động không phải là tùy chọn được nhà cung cấp hỗ trợ.

Thay đổi bộ nạp khởi động

Các lệnh getvar:max-fetch-sizefetch:name được triển khai trong fastbootd . Để hỗ trợ flash đĩa ram của nhà cung cấp trong bộ nạp khởi động, bạn phải thực hiện hai lệnh này.

Thay đổi Fastbootd

getvar:max-fetch-size tương tự như max-download-size . Nó 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 kiểm tra trên thiết bị. Nếu tất cả những điều 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ể sửa lỗi.
  • Thiết bị đã được mở khóa (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 điều này được xác minh, fetch:name[:offset[:size]] trả về kích thước và độ lệch phân vùng. Lưu ý những điều dưới đây:

  • 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 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, đối với offset là 0 và đối với size là giá trị được tính toán của partition_size - offset .

  • Độ lệch được chỉ định, 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 ở offset 0.

Thay đổi trình điều khiển

Các lệnh đã được thêm vào công cụ fastboot để thực hiện thay đổi trình điều khiển. Mỗi cái được liên kết với định nghĩa đầy đủ của nó trong bảng lệnh Fastboot .

  • fastboot fetch vendor_boot out.img

    • Gọi getvar max-fetch-size để xác định kích thước chunk.
    • 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 chunk lớn hơn kích thước vendor_boot , do đó thường chỉ có một chunk.)
    • 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 phần khởi động của nhà cung cấp là phiên bản tiêu đề 3 thì nó sẽ thực hiện như 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ì nó sẽ thực hiện như 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 đoạn đĩa ram của nhà cung cấp duy nhất 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.
  • 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, nó sẽ trả về lỗi.
    • Nếu tiêu đề khởi động của nhà cung cấp là phiên bản 4, nó sẽ thực hiện như sau:

      • Tìm đoạn 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ả khớp, sẽ trả về lỗi.
      • Thay thế đoạn đĩa ram 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.

mkbootimg

Tên default được dành riêng để đặt tên cho các mảnh đĩa ram của nhà cung cấp trong Android 12 trở lên. Mặc dù ngữ nghĩa của fastboot flash vendor_boot:default vẫn giữ nguyên, bạn không được đặt tên các đoạn đĩa ram của mình làm default .

Những thay đổi của SELinux

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