Memindahkan fastboot ke ruang pengguna

Fastboot adalah nama modul dan mode bootloader. Android 10 dan yang lebih tinggi mendukung partisi yang dapat diubah ukurannya dengan memindahkan implementasi fastboot dari bootloader ke ruang pengguna. Pemindahan ini memungkinkan pemindahan kode flashing ke lokasi umum yang dapat dipertahankan dan diuji dengan hanya bagian fastboot khusus vendor yang diimplementasikan oleh lapisan abstraksi hardware (HAL). Selain itu, Android 12 dan yang lebih tinggi mendukung flashing ramdisk melalui perintah fastboot tambahan.

Menyatukan fastboot dan pemulihan

Karena fastboot dan pemulihan ruang pengguna serupa, Anda dapat menggabungkannya ke dalam satu partisi atau biner. Hal ini memberikan keuntungan seperti penggunaan ruang yang lebih sedikit, memiliki lebih sedikit partisi secara keseluruhan, dan membuat fastboot dan pemulihan berbagi kernel dan library.

Fastbootd adalah nama daemon dan mode ruang pengguna. Untuk mendukung fastbootd, bootloader harus menerapkan perintah blok kontrol booting (BCB) baru boot-fastboot. Untuk memasuki mode fastbootd, bootloader menulis boot-fastboot ke kolom perintah pesan BCB dan membiarkan kolom recovery BCB tidak berubah (untuk memungkinkan memulai ulang tugas pemulihan yang terganggu). Kolom status, stage, dan reserved juga tetap tidak berubah. Bootloader memuat dan melakukan booting ke image pemulihan setelah melihat boot-fastboot di kolom perintah BCB. Kemudian, Pemulihan akan mengurai pesan BCB dan beralih ke mode fastbootd.

Perintah ADB

Bagian ini menjelaskan perintah adb untuk mengintegrasikan fastbootd. Perintah memiliki hasil yang berbeda, bergantung pada apakah perintah dijalankan oleh sistem atau oleh pemulihan.

Perintah Deskripsi
reboot fastboot
  • Melakukan reboot ke fastbootd (sistem).
  • Memasuki fastbootd secara langsung tanpa memulai ulang (pemulihan).

Perintah Fastboot

Bagian ini menjelaskan perintah fastboot untuk mengintegrasikan fastbootd, termasuk perintah baru untuk mem-flash dan mengelola partisi logis. Beberapa perintah memiliki hasil yang berbeda, bergantung pada apakah perintah tersebut telah dieksekusi oleh bootloader atau oleh fastbootd.

Perintah Deskripsi
reboot recovery
  • Melakukan reboot ke pemulihan (bootloader).
  • Masuk ke pemulihan secara langsung tanpa memulai ulang (fastbootd).
reboot fastboot Mulai ulang ke fastbootd.
getvar is-userspace
  • Menampilkan yes (fastbootd).
  • Menampilkan no (bootloader).
getvar is-logical:<partition> Menampilkan yes jika partisi yang diberikan adalah partisi logis, no jika tidak. Partisi logis mendukung semua perintah yang tercantum di bawah.
getvar super-partition-name Menampilkan nama partisi super. Nama ini mencakup akhiran slot saat ini jika partisi super adalah partisi A/B (biasanya tidak).
create-logical-partition <partition> <size> Membuat partisi logis dengan nama dan ukuran yang ditentukan. Nama tidak boleh sudah ada sebagai partisi logis.
delete-logical-partition <partition> Menghapus partisi logis yang diberikan (secara efektif menghapus partisi).
resize-logical-partition <partition> <size> Mengubah ukuran partisi logis ke ukuran baru tanpa mengubah isinya. Gagal jika tidak ada cukup ruang yang tersedia untuk melakukan pengubahan ukuran.
flash <partition><filename> ] Menulis file ke partisi flash. Perangkat harus dalam status tidak terkunci.
erase <partition> Menghapus partisi (tidak harus penghapusan aman). Perangkat harus dalam status tidak terkunci.
getvar <variable> | all Menampilkan variabel bootloader, atau semua variabel. Jika variabel tidak ada, error akan ditampilkan.
set_active <slot>

Menetapkan slot booting A/B yang diberikan sebagai active. Pada upaya booting berikutnya, sistem akan melakukan booting dari slot yang ditentukan.

Untuk dukungan A/B, slot adalah set partisi duplikat yang dapat di-boot secara independen. Slot diberi nama a, b, dan seterusnya, serta dibedakan dengan menambahkan akhiran _a, _b, dan seterusnya ke nama partisi.

reboot Memulai ulang perangkat secara normal.
reboot-bootloader (atau reboot bootloader) Me-reboot perangkat ke bootloader.
fastboot fetch vendor_boot <out.img>

Gunakan di Android 12 dan yang lebih baru untuk mendukung mem-flash ramdisk vendor.

Mendapatkan seluruh ukuran partisi dan ukuran potongan. Mendapatkan data untuk setiap potongan, lalu menggabungkan data untuk <out.img>

Untuk mengetahui detailnya, lihat fastboot fetch vendor_boot <out.img>.

fastboot flash vendor_boot:default <vendor-ramdisk.img>

Gunakan di Android 12 dan yang lebih tinggi untuk mendukung flashing vendor ramdisk.

Ini adalah varian khusus perintah flash. Fungsi ini menjalankan fungsi gambar fetch vendor_boot, seolah-olah fastboot fetch dipanggil. Gambar vendor_boot baru yang di-flash bergantung pada apakah versi header booting adalah versi 3 atau versi 4.

Untuk mengetahui detailnya, lihat fastboot flash vendor_boot:default <vendor-ramdisk.img>.

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Gunakan di Android 12 dan yang lebih baru untuk mendukung flashing vendor ramdisk.

Mengambil gambar vendor_boot. Menampilkan error jika header boot vendor adalah versi 3. Jika versi 4, versi ini akan menemukan fragmen ramdisk vendor yang benar (jika tersedia). Hal ini menggantikan gambar tersebut dengan gambar yang diberikan, menghitung ulang ukuran dan offset, serta memunculkan vendor_boot image baru.

Untuk mengetahui detailnya, lihat fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>

Fastboot dan bootloader

Bootloader mem-flash partisi bootloader, radio, dan boot/recovery, setelah itu perangkat melakukan booting ke fastboot (ruang pengguna) dan mem-flash semua partisi lainnya. Bootloader harus mendukung perintah berikut.

Perintah Deskripsi
download Mendownload gambar untuk di-flash.
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ Mem-flash partisi recovery/boot dan bootloader.
reboot Memulai ulang perangkat.
reboot fastboot Mulai ulang ke fastboot.
reboot recovery Melakukan reboot ke pemulihan.
getvar Mendapatkan variabel bootloader yang diperlukan untuk mem-flash image pemulihan/boot (misalnya, current-slot dan max-download-size).
oem <command> Perintah yang ditentukan oleh OEM.

Partisi dinamis

Bootloader tidak boleh mengizinkan flashing atau penghapusan partisi dinamis dan harus menampilkan error jika operasi ini dicoba. Untuk perangkat partisi dinamis yang diubah, alat fastboot (dan bootloader) mendukung mode paksa untuk langsung mem-flash partisi dinamis saat dalam mode bootloader. Misalnya, jika system adalah partisi dinamis pada perangkat yang diubah, menggunakan perintah fastboot --force flash system akan memungkinkan bootloader (bukan fastbootd) mem-flash partisi.

Pengisian daya mode nonaktif

Jika perangkat mendukung pengisian daya mode nonaktif atau melakukan booting otomatis ke mode khusus saat daya diberikan, penerapan perintah fastboot oem off-mode-charge 0 harus melewati mode khusus ini, sehingga perangkat melakukan booting seolah-olah pengguna telah menekan tombol daya.

HAL OEM Fastboot

Untuk mengganti fastboot bootloader sepenuhnya, fastboot harus menangani semua perintah fastboot yang ada. Banyak perintah ini berasal dari OEM dan didokumentasikan, tetapi memerlukan penerapan kustom. Banyak perintah khusus OEM yang tidak didokumentasikan. Untuk menangani perintah tersebut, HAL fastboot menentukan perintah OEM yang diperlukan. OEM juga dapat menerapkan perintahnya sendiri.

Definisi HAL fastboot adalah sebagai berikut:

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);

};

Aktifkan fastbootd

Untuk mengaktifkan fastbootd di perangkat:

  1. Tambahkan fastbootd ke PRODUCT_PACKAGES di device.mk: PRODUCT_PACKAGES += fastbootd.

  2. Pastikan HAL fastboot, HAL kontrol booting, dan HAL kesehatan dikemas sebagai bagian dari image pemulihan.

  3. Tambahkan izin SEPolicy khusus perangkat yang diperlukan oleh fastbootd. Misalnya, fastbootd memerlukan akses tulis ke partisi khusus perangkat untuk mem-flash partisi tersebut. Selain itu, penerapan HAL fastboot juga mungkin memerlukan izin khusus perangkat.

Untuk memvalidasi fastboot ruang pengguna, jalankan Vendor Test Suite (VTS).

Mem-flash ramdisk vendor

Android 12 dan yang lebih baru menyediakan dukungan untuk mem-flash ramdisk dengan perintah fastboot tambahan yang menarik image vendor_boot lengkap dari perangkat. Perintah ini akan meminta alat fastboot sisi host untuk membaca header boot vendor, menginstal ulang, dan mem-flash image baru.

Untuk menarik gambar vendor_boot lengkap, perintah fetch:vendor_boot ditambahkan ke protokol fastboot, dan penerapan protokol fastbootd di Android 12. Perhatikan bahwa fastbootd mengimplementasikan hal ini, tetapi bootloader itu sendiri mungkin tidak. OEM dapat menambahkan perintah fetch:vendor_boot ke penerapan bootloader protokol. Namun, jika perintah tidak dikenali dalam mode bootloader, maka mem-flash ramdisk vendor individual dalam mode bootloader bukanlah opsi yang didukung vendor.

Perubahan bootloader

Perintah getvar:max-fetch-size dan fetch:name diimplementasikan di fastbootd. Untuk mendukung flashing ramdisk vendor di bootloader, Anda harus mengimplementasikan dua perintah ini.

Perubahan fastbootd

getvar:max-fetch-size mirip dengan max-download-size. Parameter ini menentukan ukuran maksimum yang dapat dikirim perangkat dalam satu respons DATA. Driver tidak boleh mengambil ukuran yang lebih besar dari nilai ini.

fetch:name[:offset[:size]] melakukan serangkaian pemeriksaan pada perangkat. Jika semua hal berikut benar, perintah fetch:name[:offset[:size]] akan menampilkan data:

  • Perangkat menjalankan build yang dapat di-debug.
  • Perangkat tidak terkunci (status booting oranye).
  • Nama partisi yang diambil adalah vendor_boot.
  • Nilai size berada dalam 0 < size <= max-fetch-size.

Setelah diverifikasi, fetch:name[:offset[:size]] akan menampilkan ukuran dan offset partisi. Perhatikan hal berikut:

  • fetch:name setara dengan fetch:name:0, yang setara dengan fetch:name:0:partition_size.
  • fetch:name:offset setara dengan fetch:name:offset:(partition_size - offset)

Oleh karena itu, fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset).

Jika offset atau partition_size (atau keduanya) tidak ditentukan, nilai default akan digunakan, yaitu 0 untuk offset, dan nilai partition_size - offset yang dihitung untuk size.

  • Offset ditentukan, ukuran tidak ditentukan: size = partition_size - offset
  • Tidak ditentukan: nilai default digunakan untuk keduanya, size = partition_size - 0.

Misalnya, fetch:foo mengambil seluruh partisi foo pada offset 0.

Perubahan driver

Perintah ditambahkan ke alat fastboot untuk menerapkan perubahan driver. Setiap perintah ditautkan ke definisi lengkapnya dalam tabel perintah Fastboot.

  • fastboot fetch vendor_boot out.img

    • Memanggil getvar max-fetch-size untuk menentukan ukuran potongan.
    • Memanggil getvar partition-size:vendor_boot[_a] untuk menentukan ukuran seluruh partisi.
    • Memanggil fastboot fetch vendor_boot[_a]:offset:size untuk setiap chunk. (Ukuran potongan lebih besar daripada ukuran vendor_boot, sehingga biasanya hanya ada satu potongan.)
    • Menggabungkan data, ke out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Ini adalah varian khusus perintah flash. Tindakan ini mengambil gambar vendor_boot, seolah-olah fastboot fetch dipanggil.

    • Jika booting vendor adalah header versi 3, maka akan melakukan hal berikut:
      • Mengganti ramdisk vendor dengan image yang diberikan.
      • Menampilkan gambar vendor_boot baru.
    • Jika header boot vendor adalah versi 4, maka akan melakukan hal berikut:
      • Mengganti seluruh ramdisk vendor dengan image yang diberikan sehingga image yang diberikan menjadi satu-satunya fragmen ramdisk vendor dalam image vendor_boot.
      • Menghitung ulang ukuran dan offset dalam tabel ramdisk vendor.
      • Menampilkan gambar vendor_boot baru.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Mengambil vendor_boot image, seolah-olah fastboot fetch dipanggil.

    • Jika header booting vendor adalah versi 3, header akan menampilkan error.
    • Jika header booting vendor adalah versi 4, header tersebut akan melakukan hal berikut:

      • Menemukan fragmen ramdisk vendor dengan nama ramdisk_<var>&lt;foo></var>. Jika tidak ditemukan, atau jika ada beberapa kecocokan, akan menampilkan error.
      • Mengganti fragmen ramdisk vendor dengan image yang diberikan.
      • Menghitung ulang setiap ukuran dan offset dalam tabel ramdisk vendor.
      • Menampilkan gambar vendor_boot baru.
    • Jika <foo> tidak ditentukan, maka ramdisk_ akan dicari.

mkbootimg

Nama default dicadangkan untuk memberi nama fragmen ramdisk vendor di Android 12 dan yang lebih tinggi. Meskipun semantik flash vendor_boot:default fastboot tetap sama, Anda tidak boleh memberi nama fragmen ramdisk sebagai default.

Perubahan SELinux

Perubahan dilakukan di fastbootd.te untuk mendukung flashing ramdisk vendor.