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

Menerapkan Pembaruan A/B

OEM dan SoC vendor yang ingin menerapkan A / B pembaruan sistem harus memastikan alat bootloader mereka yang boot_control HAL dan melewati parameter yang benar untuk kernel.

Menerapkan kontrol boot HAL

A / B-mampu bootloader harus melaksanakan boot_control HAL di hardware/libhardware/include/hardware/boot_control.h . Anda dapat menguji implementasi menggunakan system/extras/bootctl utilitas dan system/extras/tests/bootloader/ .

Anda juga harus mengimplementasikan mesin negara yang ditunjukkan di bawah ini:

Mesin negara Gambar 1. Bootloader

Menyiapkan kernel

Untuk menerapkan pembaruan sistem A/B:

  1. Cherrypick seri patch kernel berikut (jika diperlukan):
  2. Pastikan perintah kernel baris argumen berisi argumen tambahan berikut:
    skip_initramfs rootwait ro init=/init root="/dev/dm-0 dm=system none ro,0 1 android-verity <public-key-id> <path-to-system-partition>"
    ... mana <public-key-id> nilai adalah ID dari kunci publik digunakan untuk memverifikasi tanda tangan tabel kebenaran (untuk rincian, lihat dm-kebenaran ) .
  3. Tambahkan sertifikat .X509 yang berisi kunci publik ke gantungan kunci sistem:
    1. Salin sertifikat .X509 diformat dalam .der format yang ke akar dari kernel direktori. Jika sertifikat .X509 diformat sebagai .pem berkas, gunakan berikut openssl perintah untuk mengkonversi dari .pem ke .der Format:
      openssl x509 -in <x509-pem-certificate> -outform der -out <x509-der-certificate>
    2. Membangun zImage untuk menyertakan sertifikat sebagai bagian dari sistem keyring. Untuk memverifikasi, memeriksa procfs masuk (memerlukan KEYS_CONFIG_DEBUG_PROC_KEYS harus diaktifkan):
      angler:/# cat /proc/keys
      
      1c8a217e I------     1 perm 1f010000     0     0 asymmetri
      Android: 7e4333f9bba00adfe0ede979e28ed1920492b40f: X509.RSA 0492b40f []
      2d454e3e I------     1 perm 1f030000     0     0 keyring
      .system_keyring: 1/4
      inklusi Sukses sertifikat .X509 menunjukkan adanya kunci publik dalam sistem keyring (sorot menunjukkan ID kunci publik).
    3. Ganti ruang dengan # dan lulus sebagai <public-key-id> di baris perintah kernel. Misalnya, lulus Android:#7e4333f9bba00adfe0ede979e28ed1920492b40f di tempat <public-key-id> .

Mengatur variabel build

Bootloader berkemampuan A/B harus memenuhi kriteria variabel build berikut:

Harus ditentukan untuk target A/B
  • AB_OTA_UPDATER := true
  • AB_OTA_PARTITIONS := \
    boot \
    system \
    vendor
    dan partisi lain diperbarui melalui update_engine (radio, bootloader, dll)
  • PRODUCT_PACKAGES += \
    update_engine \
    update_verifier
Sebagai contoh, lihat /device/google/marlin/+/android-7.1.0_r1/device-common.mk . Anda dapat melakukan post-install (tapi pra-reboot) dex2oat langkah yang dijelaskan dalam Kompilasi .
Sangat direkomendasikan untuk target A/B
  • Tentukan TARGET_NO_RECOVERY := true
  • Tentukan BOARD_USES_RECOVERY_AS_BOOT := true
  • Jangan mendefinisikan BOARD_RECOVERYIMAGE_PARTITION_SIZE
Tidak dapat menentukan target A/B
  • BOARD_CACHEIMAGE_PARTITION_SIZE
  • BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
Opsional untuk build debug PRODUCT_PACKAGES_DEBUG += update_engine_client

Mengatur partisi (slot)

Perangkat A/B tidak memerlukan partisi pemulihan atau partisi cache karena Android tidak lagi menggunakan partisi ini. Partisi data sekarang digunakan untuk paket OTA yang diunduh, dan kode gambar pemulihan ada di partisi boot. Semua partisi yang A / B-ed harus dinamai sebagai berikut (slot selalu bernama a , b , dll): boot_a , boot_b , system_a , system_b , vendor_a , vendor_b .

Cache

Untuk pembaruan non-A/B, partisi cache digunakan untuk menyimpan paket OTA yang diunduh dan untuk menyimpan blok sementara saat menerapkan pembaruan. Tidak pernah ada cara yang baik untuk mengukur partisi cache: seberapa besar itu harus bergantung pada pembaruan apa yang ingin Anda terapkan. Kasus terburuk adalah partisi cache sebesar citra sistem. Dengan pembaruan A/B tidak perlu menyimpan blok (karena Anda selalu menulis ke partisi yang saat ini tidak digunakan) dan dengan streaming A/B tidak perlu mengunduh seluruh paket OTA sebelum menerapkannya.

Pemulihan

RAM disk pemulihan sekarang terkandung dalam boot.img berkas. Ketika masuk ke recovery, bootloader tidak dapat menempatkan skip_initramfs pilihan pada baris perintah kernel.

Untuk pembaruan non-A/B, partisi pemulihan berisi kode yang digunakan untuk menerapkan pembaruan. Sebuah update / B diterapkan oleh update_engine berjalan di reguler gambar sistem bot. Masih ada mode pemulihan yang digunakan untuk menerapkan reset data pabrik dan sideloading paket pembaruan (dari situlah nama "pemulihan" berasal). Kode dan data untuk mode pemulihan disimpan di partisi boot biasa di ramdisk; untuk boot ke citra sistem, bootloader memberi tahu kernel untuk melewati ramdisk (jika tidak, perangkat melakukan boot ke mode pemulihan. Mode pemulihan kecil (dan sebagian besar sudah ada di partisi boot), sehingga partisi boot tidak bertambah dalam ukuran.

Fstab

The slotselect argumen harus berada di garis untuk partisi A / B-ed. Sebagai contoh:

<path-to-block-device>/vendor  /vendor  ext4  ro
wait,verify=<path-to-block-device>/metadata,slotselect

Tidak ada partisi harus dinamai vendor . Sebaliknya, partisi vendor_a atau vendor_b akan dipilih dan dipasang di /vendor mount point.

Argumen slot kernel

Slot akhiran saat ini harus dilalui baik melalui pohon perangkat tertentu (DT) node ( /firmware/android/slot_suffix ) atau melalui androidboot.slot_suffix kernel baris perintah atau argumen bootconfig.

Secara default, fastboot mem-flash slot saat ini pada perangkat A/B. Jika paket pembaruan juga berisi gambar untuk slot lain yang tidak aktif, fastboot akan mem-flash gambar tersebut juga. Pilihan yang tersedia meliputi:

  • --slot SLOT . Ganti perilaku default dan minta fastboot untuk mem-flash slot yang diteruskan sebagai argumen.
  • --set-active [ SLOT ] . Atur slot sebagai aktif. Jika tidak ada argumen opsional yang ditentukan, maka slot saat ini disetel sebagai aktif.
  • fastboot --help . Dapatkan detail tentang perintah.

Jika alat bootloader fastboot, harus mendukung perintah set_active <slot> bahwa set saat ini slot yang aktif untuk slot yang diberikan (ini juga harus menghapus bendera unbootable untuk slot itu dan me-reset hitungan retry untuk nilai default). Bootloader juga harus mendukung variabel berikut:

  • has-slot:<partition-base-name-without-suffix> . Mengembalikan "ya" jika partisi yang diberikan mendukung slot, "tidak" jika tidak.
  • current-slot . Mengembalikan akhiran slot yang akan di-boot dari berikutnya.
  • slot-count . Mengembalikan bilangan bulat yang mewakili jumlah slot yang tersedia. Saat ini, dua slot yang didukung sehingga nilai ini adalah 2 .
  • slot-successful:<slot-suffix> . Mengembalikan "ya" jika slot yang diberikan telah ditandai sebagai berhasil booting, "tidak" jika tidak.
  • slot-unbootable:<slot-suffix> . Mengembalikan "ya" jika slot yang diberikan ditandai sebagai tidak dapat di-boot, "tidak" jika tidak.
  • slot-retry-count . Jumlah percobaan ulang yang tersisa untuk mencoba mem-boot slot yang diberikan.

Untuk melihat semua variabel, menjalankan fastboot getvar all .

Menghasilkan paket OTA

The alat paket OTA mengikuti perintah yang sama seperti perintah untuk perangkat non-A / B. The target_files.zip file yang harus dihasilkan dengan mendefinisikan variabel membangun untuk target A / B. Alat paket OTA secara otomatis mengidentifikasi dan menghasilkan paket dalam format untuk pembaru A/B.

Contoh:

  • Untuk menghasilkan penuh OTA:
    ./build/make/tools/releasetools/ota_from_target_files \
        dist_output/tardis-target_files.zip \
        ota_update.zip
    
  • Untuk menghasilkan tambahan OTA:
    ./build/make/tools/releasetools/ota_from_target_files \
        -i PREVIOUS-tardis-target_files.zip \
        dist_output/tardis-target_files.zip \
        incremental_ota_update.zip
    

Mengkonfigurasi partisi

The update_engine dapat memperbarui setiap pasang dari partisi A / B didefinisikan dalam disk yang sama. Sepasang partisi memiliki awalan yang umum (seperti system atau boot ) dan akhiran per-slot (seperti _a ). Daftar partisi yang generator payload mendefinisikan pembaruan dikonfigurasi dengan AB_OTA_PARTITIONS membuat variabel.

Misalnya, jika sepasang partisi bootloader_a dan booloader_b termasuk ( _a dan _b adalah akhiran Slot), Anda dapat memperbarui partisi ini dengan menentukan berikut pada konfigurasi produk atau papan:

AB_OTA_PARTITIONS := \
  boot \
  system \
  bootloader

Semua partisi diperbarui oleh update_engine tidak boleh dimodifikasi oleh sisa dari sistem. Selama inkremental atau delta update, data biner dari slot saat ini digunakan untuk menghasilkan data di slot baru. Modifikasi apa pun dapat menyebabkan data slot baru gagal verifikasi selama proses pembaruan, dan oleh karena itu gagal pembaruan.

Mengonfigurasi pasca-instalasi

Anda dapat mengonfigurasi langkah pasca-instal secara berbeda untuk setiap partisi yang diperbarui menggunakan satu set pasangan nilai kunci. Untuk menjalankan program yang terletak di /system/usr/bin/postinst di gambar baru, menentukan path relatif ke akar filesystem di partisi sistem.

Misalnya, usr/bin/postinst adalah system/usr/bin/postinst (jika tidak menggunakan disk RAM). Selain itu, tentukan jenis filesystem untuk lolos ke mount(2) system call. Tambahkan berikut untuk produk atau perangkat .mk file (jika ada):

AB_OTA_POSTINSTALL_CONFIG += \
  RUN_POSTINSTALL_system=true \
  POSTINSTALL_PATH_system=usr/bin/postinst \
  FILESYSTEM_TYPE_system=ext4

kompilasi

Untuk alasan keamanan, system_server tidak dapat menggunakan just-in-time (JIT) kompilasi. Ini berarti Anda harus mengkompilasi menjelang file waktu ODEX untuk system_server dan dependensinya minimal; apa pun adalah opsional.

Untuk mengompilasi aplikasi di latar belakang, Anda harus menambahkan yang berikut ini ke konfigurasi perangkat produk (di device.mk produk):

  1. Sertakan komponen asli dalam build untuk memastikan skrip kompilasi dan binari dikompilasi dan disertakan dalam citra sistem.
      # A/B OTA dexopt package
      PRODUCT_PACKAGES += otapreopt_script
    
  2. Hubungkan script kompilasi untuk update_engine seperti yang berjalan sebagai post-install langkah.
      # A/B OTA dexopt update_engine hookup
      AB_OTA_POSTINSTALL_CONFIG += \
        RUN_POSTINSTALL_system=true \
        POSTINSTALL_PATH_system=system/bin/otapreopt_script \
        FILESYSTEM_TYPE_system=ext4 \
        POSTINSTALL_OPTIONAL_system=true
    

Untuk bantuan menginstal file preopted di partisi sistem kedua yang tidak terpakai, merujuk Pertama instalasi boot file DEX_PREOPT .