Fastboot adalah nama modul dan mode bootloader. Android 10 dan yang lebih baru 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 hardware abstraction layer (HAL). Selain itu, Android 12 dan yang lebih baru mendukung flashing ramdisk melalui perintah fastboot yang ditambahkan.
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 menggunakan lebih sedikit ruang, 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 mengimplementasikan perintah blok kontrol booting (BCB) baru boot-fastboot. Untuk memasuki mode fastbootd, bootloader menulis boot-fastboot ke dalam 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 dalam 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. Perintah ini memiliki hasil yang berbeda, bergantung pada apakah perintah tersebut dieksekusi oleh sistem atau oleh pemulihan.
| Perintah | Deskripsi |
|---|---|
reboot fastboot |
|
Perintah Fastboot
Bagian ini menjelaskan perintah fastboot untuk mengintegrasikan fastbootd, termasuk perintah baru untuk melakukan flashing 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 |
|
reboot fastboot |
Melakukan reboot ke fastbootd. |
getvar is-userspace |
|
getvar is-logical:<partition> |
Menampilkan yes jika partisi yang diberikan adalah partisi logis,
no jika sebaliknya.
Partisi logis mendukung semua perintah yang tercantum di bawah. |
getvar super-partition-name |
Menampilkan nama partisi super. Nama tersebut menyertakan 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 diberikan. Nama tersebut 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 yang tersedia untuk melakukan perubahan ukuran. |
flash <partition> [ <filename> ] |
Menulis file ke partisi flash. Perangkat harus dalam status tidak terkunci. |
erase <partition> |
Menghapus partisi (tidak harus menghapus secara aman). Perangkat harus dalam status tidak terkunci. |
getvar <variable> | all |
Menampilkan variabel bootloader, atau semua variabel. Jika variabel tidak ada, menampilkan error. |
set_active <slot> |
Menetapkan slot booting A/B yang diberikan sebagai Untuk dukungan A/B, slot adalah kumpulan partisi duplikat yang dapat di-boot secara independen. Slot diberi nama |
reboot |
Melakukan reboot perangkat secara normal. |
reboot-bootloader (atau reboot bootloader) |
Melakukan reboot perangkat ke bootloader. |
fastboot fetch vendor_boot <out.img> |
Gunakan di Android 12 dan yang lebih baru untuk mendukung flashing ramdisk vendor.
Mendapatkan ukuran partisi lengkap dan ukuran potongan. Mendapatkan data untuk setiap potongan,
lalu menggabungkan data ke
Untuk mengetahui detailnya, lihat |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
Gunakan di Android 12 dan yang lebih baru untuk mendukung flashing ramdisk vendor. Ini adalah varian khusus dari perintah flash. Perintah ini menjalankan fungsi image
Untuk mengetahui detailnya, lihat
|
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Gunakan di Android 12 dan yang lebih baru untuk
mendukung flashing ramdisk vendor. Mengambil image Untuk mengetahui detailnya, lihat
|
Fastboot dan bootloader
Bootloader melakukan flashing partisi bootloader, radio, dan boot/recovery, setelah itu perangkat melakukan booting ke fastboot (ruang pengguna) dan melakukan flashing semua partisi lainnya. Bootloader harus mendukung perintah berikut.
| Perintah | Deskripsi |
|---|---|
download |
Mendownload image untuk di-flash. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Melakukan flashing partisi recovery/boot dan bootloader. |
reboot |
Melakukan reboot perangkat. |
reboot fastboot |
Melakukan reboot ke fastboot. |
reboot recovery |
Melakukan reboot ke pemulihan. |
getvar |
Mendapatkan variabel bootloader yang diperlukan untuk melakukan flashing image pemulihan/booting (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 dipasang kembali, alat fastboot (dan bootloader) mendukung mode paksa untuk melakukan flashing partisi dinamis secara langsung saat berada dalam mode bootloader. Misalnya, jika system adalah partisi dinamis pada perangkat yang dipasang kembali,
penggunaan perintah fastboot --force flash system akan memungkinkan bootloader
(bukan fastbootd) melakukan flashing partisi.
Pengisian daya mode nonaktif
Jika perangkat mendukung pengisian daya mode nonaktif atau melakukan booting otomatis ke mode khusus saat daya diterapkan, implementasi 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 implementasi kustom. Banyak perintah khusus OEM tidak didokumentasikan. Untuk menangani perintah tersebut, HAL fastboot menentukan perintah OEM yang diperlukan. OEM juga dapat mengimplementasikan 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);
};
Mengaktifkan fastbootd
Untuk mengaktifkan fastbootd di perangkat:
Tambahkan
fastbootdkePRODUCT_PACKAGESdidevice.mk:PRODUCT_PACKAGES += fastbootd.Pastikan HAL fastboot, HAL kontrol booting, dan HAL kesehatan dikemas sebagai bagian dari image pemulihan.
Tambahkan izin SEPolicy khusus perangkat yang diperlukan oleh
fastbootd. Misalnya,fastbootdmemerlukan akses tulis ke partisi khusus perangkat untuk melakukan flashing partisi tersebut. Selain itu, implementasi HAL fastboot mungkin juga memerlukan izin khusus perangkat.
Untuk memvalidasi fastboot ruang pengguna, jalankan Vendor Test Suite (VTS).
Melakukan flashing ramdisk vendor
Android 12 dan yang lebih baru menyediakan dukungan untuk melakukan flashing ramdisk dengan perintah fastboot tambahan yang mengambil image vendor_boot lengkap dari perangkat. Perintah ini meminta alat fastboot sisi host untuk membaca header booting vendor, membuat ulang image, dan melakukan flashing image baru.
Untuk mengambil image vendor_boot lengkap, perintah fetch:vendor_boot ditambahkan
ke protokol fastboot, dan implementasi protokol fastbootd
di Android 12. Perhatikan bahwa fastbootd melakukan implementasi ini, tetapi bootloader itu sendiri mungkin tidak. OEM dapat menambahkan perintah fetch:vendor_boot ke implementasi protokol bootloader mereka. Namun, jika perintah tidak dikenali dalam mode bootloader, melakukan flashing 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 kedua perintah ini.
Perubahan fastbootd
getvar:max-fetch-size mirip dengan max-download-size. Perintah 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
sizeberada dalam 0 <size<=max-fetch-size.
Setelah diverifikasi, fetch:name[:offset[:size]] akan menampilkan ukuran dan offset partisi.
Perhatikan hal berikut:
fetch:namesetara denganfetch:name:0, yang setara denganfetch:name:0:partition_size.fetch:name:offsetsetara denganfetch: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
yang dihitung untuk size adalah partition_size - offset.
- Offset ditentukan, ukuran tidak 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 pada offset 0.
Perubahan driver
Perintah ditambahkan ke alat fastboot untuk mengimplementasikan perubahan driver. Setiap perintah ditautkan ke definisi lengkapnya dalam tabel perintah Fastboot commands.
fastboot fetch vendor_boot out.img- Memanggil
getvar max-fetch-sizeuntuk menentukan ukuran potongan. - Memanggil
getvar partition-size:vendor_boot[_a]untuk menentukan ukuran seluruh partisi. - Memanggil
fastboot fetch vendor_boot[_a]:offset:sizeuntuk setiap potongan. (Ukuran potongan lebih besar dari ukuranvendor_boot, sehingga biasanya hanya ada satu potongan.) - Menggabungkan data ke
out.img.
- Memanggil
fastboot flash vendor_boot:default vendor-ramdisk.imgIni adalah varian khusus dari perintah flash. Perintah ini mengambil image
vendor_boot, seolah-olahfastboot fetchdipanggil.- Jika booting vendor adalah header versi
3,
perintah ini akan melakukan hal berikut:
- Mengganti ramdisk vendor dengan image yang diberikan.
- Melakukan flashing image
vendor_bootbaru.
- Jika header booting vendor adalah versi
4,
perintah ini 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.
- Melakukan flashing image
vendor_bootbaru.
- Mengganti seluruh ramdisk vendor dengan image yang diberikan sehingga image yang diberikan menjadi satu-satunya fragmen ramdisk vendor dalam image
- Jika booting vendor adalah header versi
3,
perintah ini akan melakukan hal berikut:
fastboot flash vendor_boot:foo vendor-ramdisk.imgMengambil
vendor_boot image, seolah-olahfastboot fetchdipanggil.- Jika header booting vendor adalah versi 3, perintah ini akan menampilkan error.
Jika header booting vendor adalah versi 4, perintah ini akan melakukan hal berikut:
- Menemukan fragmen ramdisk vendor dengan nama
ramdisk_<var><foo></var>. Jika tidak ditemukan, atau jika ada beberapa kecocokan, perintah ini akan menampilkan error. - Mengganti fragmen ramdisk vendor dengan image yang diberikan.
- Menghitung ulang setiap ukuran dan offset dalam tabel ramdisk vendor.
- Melakukan flashing image
vendor_bootbaru.
- Menemukan fragmen ramdisk vendor dengan nama
Jika <foo> tidak ditentukan, perintah ini akan mencoba menemukan
ramdisk_.
mkbootimg
Nama default dicadangkan untuk memberi nama fragmen ramdisk vendor di Android 12 dan yang lebih baru. Meskipun semantik fastboot flash vendor_boot:default
tetap sama, Anda tidak boleh memberi nama fragmen ramdisk sebagai
default.
Perubahan SELinux
Perubahan dilakukan di
fastbootd.te
untuk mendukung flashing ramdisk vendor.