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 dikelola dan diuji hanya dengan 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 yang ditambahkan.
Menyatukan fastboot dan pemulihan
Karena fastboot dan pemulihan ruang pengguna serupa, Anda dapat menggabungkannya menjadi satu partisi atau biner. Hal ini memberikan keuntungan seperti menggunakan lebih sedikit ruang, memiliki partisi yang lebih sedikit secara keseluruhan, dan memiliki fastboot dan pemulihan yang berbagi kernel dan library.
Fastbootd adalah nama daemon dan mode ruang pengguna.
Untuk mendukung fastbootd
, bootloader harus menerapkan perintah blok kontrol booting
(BCB) baru 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 memulai ulang tugas
pemulihan yang terganggu). Kolom status
, stage
, dan reserved
juga tetap 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
. Perintah
ini memiliki hasil yang berbeda, bergantung pada apakah perintah dijalankan oleh sistem atau
oleh pemulihan.
Perintah | Deskripsi |
---|---|
reboot fastboot |
|
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 dijalankan oleh
bootloader atau oleh fastbootd
.
Perintah | Deskripsi |
---|---|
reboot recovery |
|
reboot fastboot |
Memulai ulang ke fastbootd . |
getvar is-userspace |
|
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 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 harus belum 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 logika ke ukuran baru tanpa mengubah kontennya. Gagal jika tidak ada cukup ruang untuk melakukan pengubahan ukuran. |
update-super <partition> |
Menggabungkan perubahan pada metadata partisi super. Jika penggabungan tidak dapat dilakukan
(misalnya, format pada perangkat adalah versi yang tidak didukung), perintah
ini akan gagal. Parameter wipe opsional akan menimpa metadata
perangkat, bukan melakukan penggabungan. |
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 keadaan tidak terkunci. |
getvar <variable> | all |
Menampilkan variabel bootloader, atau semua variabel. Jika variabel tidak ada, Anda akan 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 |
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 flashing ramdisk vendor.
Mendapatkan seluruh ukuran partisi dan ukuran potongan. Mendapatkan data untuk setiap bagian,
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. Fungsi ini menjalankan fungsi gambar
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 gambar Untuk mengetahui detailnya, lihat
|
Fastboot dan bootloader
Bootloader mem-flash partisi bootloader
, radio
, dan boot/recovery
,
setelah itu, perangkat akan melakukan booting ke fastboot (userspace) 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 |
Memulai ulang ke fastboot. |
reboot recovery |
Memulai ulang ke pemulihan. |
getvar |
Mendapatkan variabel bootloader yang diperlukan untuk melakukan 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 dimodifikasi, alat fastboot (dan bootloader) mendukung mode
paksa untuk mem-flash langsung partisi dinamis saat dalam mode bootloader. Misalnya, jika system
adalah partisi dinamis di perangkat yang dimodifikasi,
menggunakan perintah fastboot --force flash system
akan mengaktifkan bootloader
(bukan fastbootd
) untuk mem-flash partisi.
Pengisian daya dalam mode nonaktif
Jika perangkat mendukung pengisian daya dalam mode nonaktif atau melakukan booting otomatis ke mode
khusus saat daya diterapkan, implementasi perintah
fastboot oem off-mode-charge 0
harus
mengabaikan mode khusus ini, sehingga perangkat melakukan booting seolah-olah pengguna telah menekan
tombol daya.
HAL OEM Fastboot
Untuk sepenuhnya mengganti fastboot bootloader, fastboot harus menangani semua perintah fastboot yang ada. Banyak perintah ini berasal dari OEM dan didokumentasikan, tetapi memerlukan penerapan kustom. Banyak perintah khusus OEM tidak didokumentasikan. Untuk menangani perintah tersebut, HAL fastboot menentukan perintah OEM yang diperlukan. OEM juga dapat menerapkan perintah mereka 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:
Tambahkan
fastbootd
kePRODUCT_PACKAGES
didevice.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,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).
Ramdisk vendor flash
Android 12 dan yang lebih baru memberikan dukungan untuk
mem-flash ramdisk dengan perintah fastboot tambahan yang menarik
image vendor_boot
lengkap dari perangkat. Perintah ini meminta alat fastboot
sisi host untuk membaca header booting vendor, membuat ulang image, dan mem-flash image baru.
Untuk mengambil image vendor_boot
lengkap, perintah fetch:vendor_boot
ditambahkan
ke protokol fastboot, dan penerapan protokol fastbootd
di Android 12. Perhatikan bahwa fastbootd memang
mengimplementasikannya, tetapi bootloader itu sendiri mungkin tidak. OEM dapat menambahkan
perintah fetch:vendor_boot
ke penerapan bootloader
protokol mereka. Namun, jika perintah tidak dikenali dalam mode bootloader, 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 flash ramdisk vendor di bootloader, Anda harus
menerapkan kedua 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. Pengemudi 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 rentang 0 <size
<=max-fetch-size
.
Jika diverifikasi, fetch:name[:offset[:size]]
akan menampilkan ukuran dan offset
partisi.
Perhatikan hal berikut:
fetch:name
setara denganfetch:name:0
, yang setara denganfetch:name:0:partition_size
.fetch:name:offset
setara 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 untuk offset
adalah 0, dan untuk size
adalah nilai partition_size - offset
yang dihitung.
- Offset ditentukan, ukuran belum ditentukan:
size = partition_size - offset
- Tidak 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. Setiap perintah tertaut 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 bagian. (Ukuran potongan lebih besar dari ukuranvendor_boot
, jadi biasanya hanya ada satu potongan.) - Menggabungkan data menjadi
out.img
.
- Memanggil
fastboot flash vendor_boot:default vendor-ramdisk.img
Ini adalah varian khusus dari perintah flash. Metode ini mengambil gambar
vendor_boot
, seolah-olahfastboot fetch
dipanggil.- Jika booting vendor adalah header versi
3,
booting tersebut akan melakukan hal berikut:
- Mengganti ramdisk vendor dengan image yang diberikan.
- Mem-flash gambar
vendor_boot
baru.
- Jika header booting vendor adalah versi
4,
header tersebut akan melakukan hal berikut:
- Mengganti ramdisk seluruh 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.
- Mem-flash image
vendor_boot
baru.
- Mengganti ramdisk seluruh vendor dengan image yang diberikan sehingga
image yang diberikan menjadi satu-satunya fragmen ramdisk vendor dalam
image
- Jika booting vendor adalah header versi
3,
booting tersebut akan melakukan hal berikut:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Mengambil
vendor_boot image
, seolah-olahfastboot 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
ramdisk_<var><foo></var>
. Jika tidak ditemukan, atau jika ada beberapa kecocokan, error akan ditampilkan. - Mengganti fragmen ramdisk vendor dengan image yang diberikan.
- Menghitung ulang setiap ukuran dan offset dalam tabel ramdisk vendor.
- Mem-flash image
vendor_boot
baru.
- Menemukan fragmen ramdisk vendor dengan nama
Jika <foo> tidak ditentukan,
ramdisk_
akan dicoba ditemukan.
{i>mkbootimg<i}
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.