Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Memindahkan Fastboot ke Userspace

Android 10 dan yang 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 yang lebih tinggi mendukung flashing ramdisk melalui perintah fastboot tambahan.

Menyatukan fastboot dan pemulihan

Karena fastboot dan pemulihan ruang pengguna serupa, Anda dapat menggabungkannya menjadi satu partisi atau biner. Ini memberikan keuntungan seperti menggunakan lebih sedikit ruang, memiliki lebih sedikit partisi secara keseluruhan, dan memiliki fastboot dan pemulihan berbagi kernel dan perpustakaan mereka.

Untuk dukungan fastbootd , bootloader harus menerapkan kontrol blok boot (BCB) perintah baru boot-fastboot . Untuk memasukkan fastbootd modus, bootloader menulis boot-fastboot ke bidang perintah dari pesan BCB dan meninggalkan recovery bidang BCB tidak berubah (untuk mengaktifkan restart setiap tugas pemulihan terputus). The status , stage , dan reserved bidang tetap tidak berubah juga. Bootloader beban dan sepatu bot ke dalam citra pemulihan setelah melihat boot-fastboot di bidang perintah BCB. Pemulihan kemudian mem-parsing pesan BCB dan beralih ke fastbootd modus.

Perintah ADB

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

Memerintah Keterangan
reboot fastboot
  • Reboot ke fastbootd (sistem).
  • Memasuki fastbootd langsung tanpa reboot (recovery).

Perintah fastboot

Bagian ini menjelaskan perintah fastboot untuk mengintegrasikan fastbootd , termasuk perintah baru untuk berkedip dan mengelola partisi logical. Beberapa perintah memiliki hasil yang berbeda, tergantung pada apakah mereka telah dieksekusi oleh bootloader atau fastbootd .

Memerintah Keterangan
reboot recovery
  • Reboot ke pemulihan (bootloader).
  • Memasuki pemulihan langsung tanpa reboot ( fastbootd ).
reboot fastboot Reboot ke fastbootd .
getvar is-userspace
  • Pengembalian yes ( fastbootd ).
  • Pengembalian no (bootloader).
getvar is-logical: <partition> Pengembalian 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 termasuk 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 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.
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. Opsional wipe menimpa parameter metadata perangkat, daripada melakukan penggabungan.
flash <partition> [ <filename> ] Menulis file ke partisi flash. Perangkat harus dalam keadaan tidak terkunci.
erase <partition> Menghapus partisi (tidak diperlukan untuk menghapus aman). Perangkat harus dalam keadaan tidak terkunci.
getvar <variable> | all Menampilkan variabel bootloader, atau semua variabel. Jika variabel tidak ada, mengembalikan kesalahan.
set_active <slot>

Set yang diberikan A / B booting Slot sebagai active . Pada upaya boot berikutnya, sistem melakukan booting dari slot yang ditentukan.

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

reboot Reboot 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 berkedip penjual ramdisks.

Mendapatkan seluruh ukuran partisi dan ukuran chunk. Mendapatkan data untuk masing-masing potongan, kemudian jahitan data bersama-sama untuk <out.img>

Untuk rincian, lihat fastboot fetch vendor_boot <out.img> .

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

Gunakan di Android 12 dan lebih tinggi untuk mendukung berkedip penjual ramdisks.

Ini adalah varian khusus dari perintah flash. Ia melakukan fetch vendor_boot fungsi gambar, seakan fastboot fetch dipanggil. Baru vendor_boot gambar berkedip tergantung pada apakah versi booting header versi 3 atau versi 4.

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

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> Gunakan di Android 12 dan lebih tinggi untuk mendukung berkedip penjual ramdisks.

Menjemput vendor_boot gambar. Mengembalikan kesalahan jika header boot vendor adalah versi 3. Jika versi 4, ia menemukan fragmen ramdisk vendor yang benar (jika tersedia). Ia menggantikan bahwa dengan citra yang diberikan, kalkulasi ulang ukuran dan offset, dan mengedipkan baru vendor_boot image .

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

Fastboot dan bootloader

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

Memerintah Keterangan
download Download gambar untuk flash.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Berkedip recovery/boot partisi dan bootloader.
reboot Reboot perangkat.
reboot fastboot Reboot ke fastboot.
reboot recovery Reboot ke pemulihan.
getvar Mendapat variabel bootloader yang diperlukan untuk berkedip dari citra pemulihan / boot (misalnya, current-slot dan max-download-size ).
oem <command> Perintah yang ditentukan oleh OEM.

Partisi dinamis

Bootloader tidak harus membiarkan berkedip atau menghapus partisi dinamis dan harus kembali kesalahan jika operasi ini dicoba. Untuk perangkat partisi dinamis yang dipasang kembali, alat fastboot (dan bootloader) mendukung mode paksa untuk mem-flash partisi dinamis secara langsung saat dalam mode bootloader. Sebagai contoh, jika system adalah partisi dinamis pada perangkat dipasang, menggunakan fastboot --force flash system perintah memungkinkan bootloader (bukan fastbootd ) ke flash partisi.

Pengisian daya di luar mode

Jika perangkat mendukung off-mode pengisian atau autoboots ke mode khusus ketika kekuasaan diterapkan, sebuah implementasi dari fastboot oem off-mode-charge 0 perintah keharusan bypass mode khusus, sehingga sepatu perangkat seperti bila pengguna telah menekan tombol daya.

Fastboot OEM HAL

Untuk sepenuhnya mengganti 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 OEM-spesifik tidak didokumentasikan. Untuk menangani perintah seperti itu, fastboot HAL menentukan perintah OEM yang diperlukan. OEM juga dapat mengimplementasikan perintah mereka 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);

};

Mengaktifkan fastbootd

Untuk mengaktifkan fastbootd pada perangkat:

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

  2. Pastikan fastboot HAL, boot control HAL, dan health HAL dikemas sebagai bagian dari image pemulihan.

  3. Menambahkan khusus perangkat izin SEPolicy dibutuhkan oleh fastbootd . Misalnya, fastbootd membutuhkan akses write ke partisi khusus perangkat flash partisi itu. Selain itu, implementasi fastboot HAL mungkin juga memerlukan izin khusus perangkat.

Untuk memvalidasi userspace fastboot, menjalankan Penjual Test Suite (VTS) .

Mem-flash ramdisk vendor

Android 12 dan lebih tinggi menyediakan dukungan untuk berkedip ramdisks dengan menambahkan perintah fastboot yang menarik penuh vendor_boot gambar dari perangkat. Perintah tersebut meminta alat fastboot sisi host untuk membaca header boot vendor, reimage, dan mem-flash image baru.

Untuk menarik penuh vendor_boot gambar, perintah fetch:vendor_boot ditambahkan ke kedua protokol fastboot, dan pelaksanaan fastbootd dari protokol di Android 12. Perhatikan bahwa fastbootd tidak melaksanakan ini, tapi bootloader itu sendiri mungkin tidak. OEM bisa menambahkan fetch:vendor_boot perintah untuk pelaksanaan bootloader mereka dari protokol. Namun, jika perintah tidak dikenali dalam mode bootloader, maka mem-flash ramdisk masing-masing vendor dalam mode bootloader bukanlah opsi yang didukung vendor.

Perubahan bootloader

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

Perubahan fastboot

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 berikut adalah benar, fetch:name[:offset[:size]] perintah pengembalian Data:

  • Perangkat menjalankan build yang dapat di-debug.
  • Perangkat tidak terkunci (kondisi boot oranye).
  • Nama partisi diambil adalah vendor_boot .
  • The size nilai jatuh dalam 0 < size <= max-fetch-size .

Ketika ini diverifikasi, fetch:name[:offset[:size]] mengembalikan 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)

Ketika offset atau partition_size (atau keduanya) yang tidak ditentukan, nilai-nilai default yang digunakan, yang untuk offset adalah 0, dan untuk size adalah nilai yang dihitung dari partition_size - offset .

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

Misalnya, fetch:foo menjemput seluruh foo partisi di offset 0.

Perubahan pengemudi

Perintah ditambahkan ke alat fastboot untuk mengimplementasikan perubahan driver. Setiap terkait dengan definisi penuh dalam tabel perintah Fastboot .

  • fastboot fetch vendor_boot out.img

    • Panggilan getvar max-fetch-size untuk menentukan ukuran chunk.
    • Panggilan getvar partition-size:vendor_boot[_a] untuk menentukan ukuran seluruh partisi.
    • Panggilan fastboot fetch vendor_boot[_a]:offset:size untuk setiap potongan. (Ukuran potongan lebih besar dari vendor_boot ukuran, jadi ada biasanya hanya satu potongan.)
    • Jahitan data bersama-sama, untuk out.img .
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Ini adalah varian khusus dari perintah flash. Ini menjemput vendor_boot gambar, seakan fastboot fetch dipanggil.

    • Jika vendor boot sundulan versi 3 , itu tidak berikut:
      • Menggantikan ramdisk vendor dengan gambar yang diberikan.
      • Berkedip baru vendor_boot gambar.
    • Jika header penjual boot versi 4 , itu tidak berikut:
      • Menggantikan seluruh penjual ramdisk dengan citra yang diberikan sehingga gambar yang diberikan menjadi satu-satunya fragmen penjual ramdisk di vendor_boot gambar.
      • Menghitung ulang ukuran dan offset di tabel ramdisk vendor.
      • Berkedip baru vendor_boot gambar.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Menjemput vendor_boot image , seakan fastboot fetch dipanggil.

    • Jika header boot vendor adalah versi 3, ini akan mengembalikan kesalahan.
    • Jika header boot vendor adalah versi 4, ia melakukan hal berikut:

      • Menemukan vendor ramdisk fragmen dengan nama foo . Jika tidak ditemukan, atau jika ada beberapa kecocokan, mengembalikan kesalahan.
      • Menggantikan fragmen ramdisk vendor dengan gambar yang diberikan.
      • Menghitung ulang setiap ukuran dan offset di tabel ramdisk vendor.
      • Berkedip baru vendor_boot gambar.

mkbootimg

Nama default dicadangkan untuk penamaan fragmen penjual ramdisk di Android 12 dan lebih tinggi. Sementara fastboot flash vendor_boot:default semantik tetap sama, Anda tidak harus nama fragmen ramdisk Anda sebagai default .

SELinux berubah

Sebuah perubahan dibuat di fastbootd.te untuk mendukung berkedip penjual ramdisks.