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

Menerapkan Virtual A/B

Untuk menerapkan A/B virtual pada perangkat baru, atau untuk memasang kembali perangkat yang diluncurkan, Anda harus membuat perubahan pada kode khusus perangkat.

Bangun bendera

Perangkat yang menggunakan virtual A / B harus dikonfigurasi sebagai perangkat A / B dan harus memulai dengan partisi dinamis .

Untuk perangkat yang diluncurkan dengan A/B virtual, atur agar mewarisi konfigurasi basis perangkat A/B virtual:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

Perangkat meluncurkan dengan maya kebutuhan A / B hanya setengah sebanyak ukuran papan untuk BOARD_SUPER_PARTITION_SIZE karena slot B tidak lagi super. Artinya, BOARD_SUPER_PARTITION_SIZE harus lebih besar dari atau sama dengan jumlah (ukuran kelompok update) + biaya overhead, yang, pada gilirannya, harus lebih besar dari atau sama dengan jumlah (ukuran partisi) + biaya overhead.

Untuk mengaktifkan snapshot terkompresi dengan Virtual A/B, sebagai gantinya mewarisi konfigurasi dasar berikut:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

Kontrol boot HAL

The kontrol booting HAL menyediakan sebuah antarmuka untuk klien OTA untuk slot kontrol booting. Virtual A/B memerlukan pemutakhiran versi kecil dari HAL kontrol boot karena API tambahan diperlukan untuk memastikan bootloader dilindungi selama flashing/reset pabrik. Lihat IBootControl.hal dan types.hal untuk versi terbaru dari definisi HAL.

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

Perubahan Fstab

Integritas partisi metadata sangat penting untuk proses boot, terutama setelah pembaruan OTA diterapkan. Jadi, partisi metadata harus diperiksa sebelum first_stage_init gunung itu. Untuk memastikan hal ini terjadi, tambahkan check bendera fs_mgr untuk entri untuk /metadata . Berikut ini memberikan contoh:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

Persyaratan kernel

Untuk mengaktifkan snapshotting, set CONFIG_DM_SNAPSHOT untuk true .

Untuk perangkat yang menggunakan F2FS, termasuk f2fs: ekspor FS_NOCOW_FL bendera untuk pengguna kernel patch untuk file yang memperbaiki menjepit. Sertakan f2fs: dukungan selaras disematkan berkas Patch kernel juga.

Virtual A / B mengandalkan fitur yang ditambahkan di kernel versi 4.3: bit status meluap di snapshot dan snapshot-merge target. Semua perangkat yang diluncurkan dengan Android 9 dan yang lebih baru seharusnya sudah memiliki kernel versi 4.4 atau yang lebih baru.

Untuk mengaktifkan snapshot terkompresi, versi kernel minimum yang didukung adalah 4.19. Set CONFIG_DM_USER=m atau CONFIG_DM_USER=y . Jika menggunakan yang pertama (modul), modul harus dimuat di ramdisk tahap pertama. Ini dapat dicapai dengan menambahkan baris berikut ke perangkat Makefile:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Perkuatan pada perangkat yang ditingkatkan ke Android 11

Saat memutakhirkan ke Android 11, perangkat yang diluncurkan dengan partisi dinamis dapat secara opsional melakukan retrofit A/B virtual. Proses pembaruan sebagian besar sama dengan peluncuran perangkat dengan A/B virtual, dengan beberapa perbedaan kecil:

  • Lokasi file SAPI - Untuk perangkat peluncuran, klien OTA menggunakan semua ruang kosong yang tersedia di partisi yang super sebelum menggunakan ruang di /data . Untuk perangkat retrofit, selalu ada cukup ruang di partisi yang super sehingga file KK tidak pernah dibuat pada /data .

  • Bendera fitur build-waktu - Untuk perangkat perkuatan maya A / B, baik PRODUCT_VIRTUAL_AB_OTA dan PRODUCT_VIRTUAL_AB_OTA_RETROFIT ditetapkan untuk true , seperti yang ditunjukkan di bawah ini:

    (call inherit-product, \
        (SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
    
  • Ukuran partisi yang super - Perangkat meluncurkan dengan maya A / B dapat memotong BOARD_SUPER_PARTITION_SIZE setengah karena slot B tidak di partisi super. Perangkat perkuatan maya A / B menjaga ukuran partisi super tua, sehingga BOARD_SUPER_PARTITION_SIZE lebih besar dari atau sama dengan 2 * sum (ukuran kelompok update) + biaya overhead, yang pada gilirannya lebih besar dari atau sama dengan 2 * sum (ukuran partisi) + biaya overhead.

Perubahan bootloader

Selama langkah penggabungan dari update, /data memegang satu-satunya seluruh turunan dari OS Android. Setelah migrasi dimulai, asli system , vendor , dan product partisi tidak lengkap sampai selesai copy. Jika perangkat dikembalikan ke setelan pabrik selama proses ini, baik dengan pemulihan atau melalui dialog Pengaturan sistem, maka perangkat tidak dapat di-boot.

Sebelum menghapus /data , menyelesaikan penggabungan dalam pemulihan atau rollback tergantung pada keadaan perangkat:

  • Jika build baru berhasil di-boot sebelumnya, selesaikan migrasi.
  • Jika tidak, kembalikan ke slot lama:
    • Untuk partisi dinamis, putar kembali ke keadaan sebelumnya.
    • Untuk partisi statis, setel slot aktif ke slot lama.

Kedua bootloader dan fastbootd dapat menghapus /data partisi jika perangkat terkunci. Sementara fastbootd dapat memaksa migrasi untuk menyelesaikan, bootloader tidak bisa. Bootloader tidak tahu apakah atau tidak gabungan sedang berlangsung, atau apa blok di /data merupakan partisi OS. Perangkat harus mencegah pengguna secara tidak sadar membuat perangkat tidak dapat dioperasikan (bricking) dengan melakukan hal berikut:

  1. Menerapkan kontrol booting HAL sehingga bootloader dapat membaca nilai yang ditetapkan oleh setSnapshotMergeStatus() metode.
  2. Jika status merge adalah MERGING , atau jika status merge adalah SNAPSHOTTED dan slot telah berubah ke slot baru diperbarui, kemudian meminta untuk menghapus userdata , metadata , atau partisi menyimpan status merge harus ditolak di bootloader.
  3. Melaksanakan fastboot snapshot-update cancel perintah sehingga pengguna dapat sinyal ke bootloader bahwa mereka ingin memotong mekanisme perlindungan ini.
  4. Modifikasi kustom berkedip alat atau script untuk masalah fastboot snapshot-update cancel ketika berkedip seluruh perangkat. Ini aman untuk dikeluarkan karena mem-flash seluruh perangkat menghilangkan OTA. Perkakas dapat mendeteksi perintah ini pada saat runtime dengan menerapkan fastboot getvar snapshot-update-status . Perintah ini membantu membedakan antara kondisi kesalahan.

Contoh

struct VirtualAbState {
    uint8_t StructVersion;
    uint8_t MergeStatus;
    uint8_t SourceSlot;
};

bool ShouldPreventUserdataWipe() {
    VirtualAbState state;
    if (!ReadVirtualAbState(&state)) ...
    return state.MergeStatus == MergeStatus::MERGING ||
           (state.MergeStatus == MergeStatus::SNAPSHOTTED &&
            state.SourceSlot != CurrentSlot()));
}

Perubahan alat fastboot

Android 11 membuat perubahan berikut pada protokol fastboot:

  • getvar snapshot-update-status - Pengembalian nilai bahwa HAL kontrol booting dikomunikasikan kepada bootloader:
    • Jika negara tersebut MERGING , bootloader harus kembali merging .
    • Jika negara tersebut SNAPSHOTTED , bootloader harus kembali snapshotted .
    • Jika tidak, bootloader harus kembali none .
  • snapshot-update merge - Selesaikan operasi gabungan, booting ke recovery / fastbootd jika diperlukan. Perintah ini hanya berlaku jika snapshot-update-status adalah merging , dan hanya didukung di fastbootd.
  • snapshot-update cancel - Status penggabungan Set kontrol booting HAL untuk CANCELLED . Perintah ini tidak valid saat perangkat terkunci.
  • erase atau wipe - Sebuah erase atau wipe dari metadata , userdata , atau partisi memegang status penggabungan untuk kontrol booting HAL harus memeriksa status snapshot merge. Jika status MERGING atau SNAPSHOTTED , perangkat harus membatalkan operasi.
  • set_active - Sebuah set_active perintah yang mengubah slot aktif harus memeriksa status snapshot merge. Jika status MERGING , perangkat harus membatalkan operasi. Slot aman dapat diubah dalam SNAPSHOTTED negara.

Perubahan ini dirancang untuk mencegah secara tidak sengaja membuat perangkat tidak dapat di-boot, tetapi dapat mengganggu perkakas otomatis. Ketika perintah yang digunakan sebagai komponen berkedip semua partisi, seperti menjalankan fastboot flashall , dianjurkan untuk menggunakan aliran berikut:

  1. Query getvar snapshot-update-status .
  2. Jika merging atau snapshotted , masalah snapshot-update cancel .
  3. Lanjutkan dengan langkah-langkah flashing.

Mengurangi persyaratan penyimpanan

Perangkat yang tidak memiliki penyimpanan A / B penuh dialokasikan dalam super, dan mengharapkan untuk penggunaan /data diperlukan, sangat dianjurkan untuk menggunakan alat blok pemetaan. Alat pemetaan blok menjaga alokasi blok tetap konsisten di antara build, mengurangi penulisan yang tidak perlu ke snapshot. Hal ini didokumentasikan di bawah Mengurangi Ukuran OTA .