Android 10 dan lebih tinggi mendukung partisi yang dapat diubah ukurannya dengan memindahkan implementasi fastboot dari bootloader ke ruang pengguna. Relokasi ini memungkinkan pemindahan kode flashing ke lokasi umum yang dapat dipelihara dan diuji dengan hanya bagian fastboot khusus vendor yang diimplementasikan oleh lapisan abstraksi perangkat keras (HAL). Selain itu, Android 12 dan lebih tinggi mendukung flashing ramdisk melalui perintah fastboot tambahan.
Menyatukan fastboot dan pemulihan
Karena fastboot dan pemulihan userspace serupa, Anda dapat menggabungkannya menjadi satu partisi atau biner. Hal ini memberikan keuntungan seperti menggunakan lebih sedikit ruang, memiliki lebih sedikit partisi secara keseluruhan, dan memiliki fastboot dan recovery yang berbagi kernel dan perpustakaannya.
Untuk mendukung fastbootd
, bootloader harus mengimplementasikan perintah boot control block (BCB) baru dari boot-fastboot
. Untuk masuk ke mode fastbootd
, bootloader menulis boot-fastboot
ke dalam kolom perintah pesan BCB dan membiarkan kolom recovery
BCB tidak berubah (untuk mengaktifkan memulai ulang tugas pemulihan yang terputus). Bidang status
, stage
, dan reserved
juga tetap tidak berubah. Bootloader memuat dan melakukan booting ke image pemulihan setelah melihat boot-fastboot
di bidang perintah BCB. Pemulihan kemudian mem-parsing pesan BCB dan beralih ke mode fastbootd
.
perintah ADB
Bagian ini menjelaskan perintah adb
untuk mengintegrasikan fastbootd
. Perintah tersebut memiliki hasil yang berbeda, bergantung pada apakah dijalankan oleh sistem atau oleh pemulihan.
Memerintah | Keterangan |
---|---|
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 dijalankan oleh bootloader atau fastbootd
.
Memerintah | Keterangan |
---|---|
reboot recovery |
|
reboot fastboot | Reboot ke fastbootd . |
getvar is-userspace |
|
getvar is-logical: <partition> | Mengembalikan yes jika partisi yang diberikan adalah partisi logis, no sebaliknya. Partisi logis mendukung semua perintah yang tercantum di bawah ini. |
getvar super-partition-name | Mengembalikan 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 tertentu. Nama tersebut tidak boleh sudah ada sebagai partisi logis. |
delete-logical-partition <partition> | Menghapus partisi logis tertentu (secara efektif menghapus partisi). |
resize-logical-partition <partition> <size> | Mengubah ukuran partisi logis ke ukuran baru tanpa mengubah isinya. Gagal jika tidak tersedia cukup ruang untuk melakukan pengubahan ukuran. |
update-super <partition> | Menggabungkan perubahan pada metadata partisi super. Jika penggabungan tidak memungkinkan (misalnya, format pada perangkat adalah versi yang tidak didukung), maka perintah ini gagal. Parameter wipe opsional akan menimpa metadata perangkat, bukan melakukan penggabungan. |
flash <partition> [ <filename> ] | Menulis file ke partisi flash. Perangkat harus dalam keadaan tidak terkunci. |
erase <partition> | Menghapus partisi (tidak diperlukan penghapusan aman). Perangkat harus dalam keadaan tidak terkunci. |
getvar <variable> | all | Menampilkan variabel bootloader, atau semua variabel. Jika variabel tidak ada, akan menghasilkan kesalahan. |
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 | Nyalakan ulang perangkat secara normal. |
reboot-bootloader (atau reboot bootloader ) | Reboot perangkat ke bootloader. |
fastboot fetch vendor_boot <out.img> | Gunakan di Android 12 dan lebih tinggi untuk mendukung flashing ramdisk vendor. Mendapatkan seluruh ukuran partisi dan ukuran potongan. Mendapatkan data untuk setiap potongan, lalu menggabungkan data tersebut ke Untuk detailnya, lihat |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | Gunakan di Android 12 dan lebih tinggi untuk mendukung flashing ramdisk vendor. Ini adalah varian khusus dari perintah flash. Ia melakukan fungsi Untuk detailnya, lihat |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | Gunakan di Android 12 dan lebih tinggi untuk mendukung flashing ramdisk vendor. Mengambil gambar Untuk detailnya, lihat |
Fastboot dan bootloader
Bootloader mem-flash partisi bootloader
, radio
, dan boot/recovery
, setelah itu perangkat melakukan booting ke fastboot (userspace) dan mem-flash semua partisi lainnya. Bootloader harus mendukung perintah berikut.
Memerintah | Keterangan |
---|---|
download | Mengunduh gambar ke flash. |
flash recovery <image> / flash boot <image> / flash bootloader <image> / | Mem-flash partisi recovery/boot dan bootloader. |
reboot | Nyalakan ulang perangkat. |
reboot fastboot | Reboot ke fastboot. |
reboot recovery | 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 ditentukan oleh OEM. |
Partisi dinamis
Bootloader tidak boleh mengizinkan flashing atau penghapusan partisi dinamis dan harus mengembalikan kesalahan jika operasi ini dilakukan. Untuk perangkat partisi dinamis yang dipasang, alat fastboot (dan bootloader) mendukung mode paksa untuk mem-flash partisi dinamis secara langsung saat berada dalam mode bootloader. Misalnya, jika system
adalah partisi dinamis pada perangkat yang dipasang, menggunakan perintah fastboot --force flash system
akan mengaktifkan bootloader (bukan fastbootd
) untuk mem-flash partisi tersebut.
Pengisian daya di luar mode
Jika perangkat mendukung pengisian daya di luar mode atau melakukan booting otomatis ke mode khusus saat daya dialirkan, penerapan perintah fastboot oem off-mode-charge 0
harus melewati mode khusus ini, sehingga perangkat melakukan booting seolah-olah pengguna telah menekan tombol daya.
Fastboot OEM HAL
Untuk sepenuhnya menggantikan fastboot bootloader, fastboot harus menangani semua perintah fastboot yang ada. Banyak dari perintah ini berasal dari OEM dan didokumentasikan tetapi memerlukan implementasi khusus. Banyak perintah khusus OEM tidak didokumentasikan. Untuk menangani perintah tersebut, fastboot HAL menentukan perintah OEM yang diperlukan. OEM juga dapat menerapkan perintah mereka sendiri.
Pengertian 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);
};
Mengaktifkan fastbootd
Untuk mengaktifkan fastbootd
pada perangkat:
Tambahkan
fastbootd
kePRODUCT_PACKAGES
didevice.mk
:PRODUCT_PACKAGES += fastbootd
.Pastikan HAL fastboot, HAL kontrol boot, dan HAL kesehatan dikemas sebagai bagian dari citra 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, implementasi fastboot HAL mungkin juga memerlukan izin khusus perangkat.
Untuk memvalidasi fastboot ruang pengguna, jalankan Vendor Test Suite (VTS) .
Mem-flash ramdisk vendor
Android 12 dan lebih tinggi memberikan dukungan untuk mem-flash ramdisk dengan perintah fastboot tambahan yang mengambil image vendor_boot
lengkap dari perangkat. Perintah ini meminta alat fastboot sisi host untuk membaca header boot vendor, melakukan image ulang, dan mem-flash image baru.
Untuk menarik image vendor_boot
lengkap, perintah fetch:vendor_boot
telah ditambahkan ke protokol fastboot, dan implementasi protokol fastbootd di Android 12. Perhatikan bahwa fastbootd memang mengimplementasikan 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, maka mem-flash masing-masing ramdisk vendor 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 menerapkan dua perintah ini.
Perubahan fastbootd
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]]
melakukan serangkaian pemeriksaan pada perangkat. Jika semua hal berikut ini benar, perintah fetch:name[:offset[:size]]
akan mengembalikan data:
- Perangkat menjalankan build yang dapat di-debug.
- Perangkat tidak terkunci (status boot oranye).
- Nama partisi yang diambil adalah
vendor_boot
. - Nilai
size
berada dalam 0 <size
<=max-fetch-size
.
Ketika ini diverifikasi, fetch:name[:offset[:size]]
mengembalikan ukuran partisi dan offset. Perhatikan hal berikut:
-
fetch:name
setara denganfetch:name:0
, yang setara denganfetch:name:0:partition_size
. -
fetch:name:offset
sama denganfetch:name:offset:(partition_size - offset)
Oleh karena itu fetch:name[:offset[:size]]
= fetch:name:offset:(partition_size - offset)
Ketika offset
atau partition_size
(atau keduanya) tidak ditentukan, nilai default digunakan, yang untuk offset
adalah 0, dan untuk size
adalah nilai terhitung dari 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 pengemudi
Perintah ditambahkan ke alat fastboot untuk mengimplementasikan perubahan driver. Masing-masing ditautkan ke definisi lengkapnya di 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 potongan. (Ukuran bongkahan lebih besar dari ukuranvendor_boot
, jadi biasanya hanya ada satu bongkahan.) - Menggabungkan data menjadi
out.img
.
- Memanggil
fastboot flash vendor_boot:default vendor-ramdisk.img
Ini adalah varian khusus dari perintah flash. Ini mengambil gambar
vendor_boot
, seolah-olahfastboot fetch
dipanggil.- Jika boot vendor adalah header version 3 , ia melakukan hal berikut:
- Mengganti ramdisk vendor dengan gambar yang diberikan.
- Mem-flash gambar
vendor_boot
baru.
- Jika header boot vendor adalah versi 4 , ia akan melakukan hal berikut:
- Mengganti seluruh ramdisk vendor dengan image yang diberikan sehingga image yang diberikan menjadi satu-satunya fragmen ramdisk vendor di image
vendor_boot
. - Menghitung ulang ukuran dan offset dalam tabel ramdisk vendor.
- Mem-flash gambar
vendor_boot
baru.
- Mengganti seluruh ramdisk vendor dengan image yang diberikan sehingga image yang diberikan menjadi satu-satunya fragmen ramdisk vendor di image
- Jika boot vendor adalah header version 3 , ia melakukan hal berikut:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Mengambil
vendor_boot image
, seolah-olahfastboot fetch
dipanggil.- Jika header boot vendor adalah versi 3, ia mengembalikan kesalahan.
Jika header boot vendor adalah versi 4, ia akan melakukan hal berikut:
- Menemukan fragmen vendor ramdisk dengan nama
foo
. Jika tidak ditemukan, atau jika ada beberapa kecocokan, akan terjadi kesalahan. - Menggantikan fragmen ramdisk vendor dengan gambar yang diberikan.
- Menghitung ulang setiap ukuran dan offset dalam tabel ramdisk vendor.
- Mem-flash gambar
vendor_boot
baru.
- Menemukan fragmen vendor ramdisk dengan nama
mkbootimg
Nama default
dicadangkan untuk memberi nama fragmen ramdisk vendor di Android 12 dan lebih tinggi. Meskipun semantik fastboot flash vendor_boot:default
tetap sama, Anda tidak boleh memberi nama fragmen ramdisk Anda sebagai default
.
SELinux berubah
Perubahan dilakukan di fastbootd.te
untuk mendukung flashing ramdisk vendor.