Memindahkan fastboot ke ruang pengguna

Android 10 dan yang lebih baru mendukung partisi yang dapat diubah ukurannya berdasarkan memindahkan implementasi fastboot dari bootloader ke userspace. Ini memungkinkan pemindahan kode yang berkedip ke dalam server yang dapat dipelihara dan diuji lokasi umum dengan hanya bagian khusus vendor dari fastboot yang diimplementasikan oleh {i>hardware abstraction layer <i}(HAL). Selain itu, Android 12 dan yang lebih tinggi mendukung {i>flash ramdisk<i} melalui perintah {i>fastboot<i} yang ditambahkan.

Menyatukan fastboot dan pemulihan

Karena fastboot dan pemulihan {i>userspace<i} mirip, Anda dapat menggabungkannya menjadi satu partisi atau biner. Hal ini memberikan keuntungan seperti menghemat ruang, memiliki lebih sedikit partisi secara keseluruhan, dan memiliki {i> fastboot<i} dan pemulihan berbagi {i>kernel<i} dan {i>library<i}.

Untuk mendukung fastbootd, bootloader harus mengimplementasikan blok kontrol booting baru (BCB) dari boot-fastboot. Untuk memasuki mode fastbootd, bootloader menulis boot-fastboot ke kolom perintah pesan BCB dan membiarkan Kolom recovery BCB tidak berubah (untuk mengaktifkan mulai ulang setiap pemulihan yang terganggu tugas). Kolom status, stage, dan reserved juga tidak berubah. Bootloader akan dimuat dan melakukan booting ke image pemulihan setelah melihat boot-fastboot di kolom perintah BCB. Pemulihan kemudian mengurai pesan BCB dan beralih ke mode fastbootd.

Perintah ADB

Bagian ini menjelaskan perintah adb untuk mengintegrasikan fastbootd. Tujuan memiliki hasil yang berbeda, tergantung apakah perintah itu dijalankan oleh sistem atau oleh pemulihan.

Perintah Deskripsi
reboot fastboot
  • Memulai ulang ke fastbootd (sistem).
  • Memasukkan fastbootd secara langsung tanpa mulai ulang (pemulihan).

Perintah fastboot

Bagian ini menjelaskan perintah fastboot untuk mengintegrasikan fastbootd, termasuk perintah baru untuk melakukan {i>flash<i} dan mengelola partisi logis. Agak besar perintah memiliki hasil yang berbeda, tergantung pada apakah mereka telah dieksekusi bootloader atau oleh fastbootd.

Perintah Deskripsi
reboot recovery
  • Memulai ulang ke pemulihan (bootloader).
  • Memasuki pemulihan secara langsung tanpa memulai ulang (fastbootd).
reboot fastboot Memulai ulang ke fastbootd.
getvar is-userspace
  • Menampilkan yes (fastbootd).
  • Menampilkan no (bootloader).
getvar is-logical:<partition> Menampilkan yes jika partisi yang ditentukan adalah partisi logis, no sebaliknya. Partisi logis mendukung semua perintah yang tercantum di bawah ini.
getvar super-partition-name Menampilkan nama partisi super. Nama menyertakan slot saat ini akhiran jika partisi super adalah partisi A/B (biasanya bukan).
create-logical-partition <partition> <size> Membuat partisi logis dengan nama dan ukuran yang diberikan. 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 kontennya. Gagal jika tidak ada cukup ruang untuk melakukan perubahan ukuran.
update-super <partition> Menggabungkan perubahan pada metadata partisi super. Jika penggabungan tidak dapat dilakukan (misalnya, format di perangkat adalah versi yang tidak didukung), maka perintah gagal. Parameter wipe opsional menimpa parameter metadata, alih-alih melakukan penggabungan.
flash <partition><filename> ] Menulis file ke partisi flash. Perangkat harus dalam status tidak terkunci.
erase <partition> Menghapus partisi (tidak perlu berupa penghapusan dengan aman). Perangkat harus berada di status tidak terkunci.
getvar <variable> | all Menampilkan variabel bootloader, atau semua variabel. Jika variabel tersebut tidak ada, menghasilkan pesan {i>error<i}.
set_active <slot>

Menetapkan slot booting A/B yang ditentukan sebagai active. Di berikutnya upaya {i>booting<i}, sistem akan melakukan {i>booting<i} dari slot yang ditentukan.

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

reboot Memulai ulang perangkat seperti biasa.
reboot-bootloader (atau reboot bootloader) Memulai ulang 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 datanya menjadi <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 baru untuk mendukung flash ramdisk vendor.

Ini adalah varian khusus dari perintah flash. Menjalankan fungsi gambar fetch vendor_boot, seolah-olah fastboot fetch dipanggil. Gambar vendor_boot baru yang berkedip bergantung pada apakah versi {i>booting<i} 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 {i>flash<i} ramdisk vendor.

Mengambil gambar vendor_boot. Menampilkan error jika vendor header booting adalah versi 3. Jika yang digunakan adalah versi 4, alat ini akan menemukan fragmen ramdisk vendor (jika tersedia). Ia menggantinya dengan gambar yang diberikan, menghitung ulang ukuran dan offset, serta melakukan flash vendor_boot image baru.

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

Fastboot dan bootloader

Bootloader akan melakukan flash bootloader, radio, dan boot/recovery partisi, setelah itu perangkat melakukan booting ke fastboot (userspace) dan berkedip semua partisi lainnya. Bootloader harus mendukung perintah berikut.

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

Partisi dinamis

Bootloader tidak boleh mengizinkan flash atau penghapusan partisi dinamis dan harus menampilkan error jika operasi tersebut dicoba. Untuk diretrofit perangkat partisi dinamis, alat fastboot (dan bootloader) mendukung gaya untuk langsung mem-flash partisi dinamis saat dalam mode bootloader. Sebagai misalnya, jika system adalah partisi dinamis pada perangkat yang diretrofit, menggunakan perintah fastboot --force flash system akan mengaktifkan bootloader (bukan fastbootd) untuk melakukan flash partisi.

Pengisian daya nonaktif

Jika perangkat mendukung pengisian daya nonaktif atau booting otomatis ke perangkat saat daya diterapkan, implementasi dari Perintah fastboot oem off-mode-charge 0 harus melewati mode khusus ini, sehingga perangkat melakukan {i>booting<i} seolah-olah pengguna telah menekan tombol daya.

HAL OEM fastboot

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

Definisi fastboot HAL 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 bahwa fastboot HAL, boot control HAL, dan HAL kesehatan dikemas sebagai bagian dari image pemulihan.

  3. Tambahkan izin SEPolicy khusus perangkat yang diperlukan oleh fastbootd. Sebagai misalnya, fastbootd memerlukan akses tulis ke partisi khusus perangkat untuk melakukan flash partisi tersebut. Selain itu, implementasi HAL {i> fastboot<i} juga dapat memerlukan izin khusus perangkat.

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

Ramdisk vendor flash

Android 12 dan yang lebih baru menyediakan dukungan untuk mem-flash ramdisk dengan tambahan perintah {i> fastboot<i} yang menarik vendor_boot gambar dari perangkat. Perintah ini meminta fastboot sisi host {i>tool<i} untuk membaca {i>header<i} {i>boot<i} vendor, melakukan {i>reimage<i}, dan melakukan flash image baru.

Untuk mengambil gambar vendor_boot lengkap, perintah fetch:vendor_boot ditambahkan ke protokol {i>fastboot<i}, dan implementasi protokol {i>fastboot<i} di Android 12. Perlu diketahui bahwa fastboot melakukan mengimplementasikan ini, tetapi {i>bootloader<i} itu sendiri mungkin tidak. OEM dapat menambahkan perintah fetch:vendor_boot ke implementasi bootloader dan berperforma tinggi karena merupakan protokol biner. Namun, jika perintah tersebut tidak dikenali dalam mode {i>bootloader<i}, maka mem-flash ramdisk vendor individual dalam mode {i>bootloader<i} tidak didukung oleh vendor sebelumnya.

Perubahan bootloader

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

Perubahan fastbooting

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

fetch:name[:offset[:size]] menjalankan serangkaian pemeriksaan pada perangkat. Jika semua dari 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 rentang 0 < size <= max-fetch-size.

Saat diverifikasi, fetch:name[:offset[:size]] akan menampilkan ukuran partisi dan offset. 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, elemen nilai default digunakan, yang untuk offset adalah 0, dan untuk size adalah nilai yang dihitung sebesar partition_size - offset.

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

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

Perubahan driver

Perintah ditambahkan ke alat fastboot untuk menerapkan perubahan driver. Masing-masing adalah tertaut ke definisi lengkapnya dalam tabel Fastboot perintah.

  • 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 potongan data. (Ukuran potongan lebih besar dari ukuran vendor_boot, jadi biasanya hanya ada satu bagian.)
    • Menggabungkan data menjadi out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Ini adalah varian khusus dari perintah flash. Ia mengambil Gambar vendor_boot, seolah-olah fastboot fetch dipanggil.

    • Jika booting vendor adalah versi header 3 fungsi ini melakukan hal berikut:
      • Mengganti ramdisk vendor dengan gambar yang diberikan.
      • Mem-flash gambar vendor_boot baru.
    • Jika header booting vendor adalah version 4, fungsi ini melakukan hal berikut:
      • Mengganti seluruh ramdisk vendor dengan gambar yang diberikan sehingga gambar yang diberikan menjadi satu-satunya fragmen ramdisk vendor di vendor_boot gambar.
      • Menghitung ulang ukuran dan offset dalam tabel ramdisk vendor.
      • Mem-flash 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 tersebut akan menampilkan error.
    • Jika header booting vendor adalah versi 4, header tersebut akan melakukan hal berikut:

      • Menemukan fragmen ramdisk vendor dengan nama foo. Jika tidak ditemukan, atau jika ada beberapa kecocokan, akan ditampilkan error.
      • Mengganti fragmen ramdisk vendor dengan gambar yang diberikan.
      • Menghitung ulang setiap ukuran dan offset dalam tabel ramdisk vendor.
      • Mem-flash gambar vendor_boot baru.

{i>mkbootimg<i}

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

Perubahan SELinux

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