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

Tata Letak Partisi

Di Android 10, sistem file root tidak lagi termasuk dalam ramdisk.img dan bukan dilebur menjadi system.img (yaitu, system.img selalu dibuat seakan BOARD_BUILD_SYSTEM_ROOT_IMAGE adalah set). Perangkat diluncurkan dengan Android 10:

  • Gunakan tata letak partisi sistem-sebagai-root (secara otomatis diberlakukan oleh build tanpa opsi untuk mengubah perilaku).
  • Harus menggunakan ramdisk, yang diperlukan untuk dm-linear.
  • Harus mengatur BOARD_BUILD_SYSTEM_ROOT_IMAGE ke false . Pengaturan ini hanya digunakan untuk membedakan antara perangkat yang menggunakan ramdisk dan perangkat yang tidak menggunakan ramdisk (dan bukannya me-mount system.img langsung).

Arti dari sistem-sebagai-akar berbeda konfigurasi antara Android 9 dan Android 10. Dalam konfigurasi Android 9 sistem-sebagai-root, BOARD_BUILD_SYSTEM_ROOT_IMAGE diatur untuk true , yang kekuatan membangun untuk menggabungkan sistem file root ke system.img kemudian me-mount system.img sebagai sistem file root (rootfs). Konfigurasi ini adalah wajib untuk perangkat meluncurkan dengan Android 9 tetapi opsional untuk perangkat upgrade ke Android 9 dan untuk perangkat yang menjalankan versi yang lebih rendah dari Android. Dalam konfigurasi Android 10 sistem-sebagai-root, membangun selalu menyatu $TARGET_SYSTEM_OUT dan $TARGET_ROOT_OUT ke system.img ; konfigurasi ini adalah perilaku default untuk semua perangkat yang menjalankan Android 10.

Android 10 membuat perubahan lebih lanjut untuk dukungan partisi dinamis , sistem partisi userspace yang memungkinkan over-the-air (OTA) update untuk membuat, mengubah ukuran, atau menghancurkan partisi. Sebagai bagian dari perubahan ini, kernel Linux tidak dapat lagi memasang partisi sistem logis pada perangkat yang menjalankan Android 10, jadi operasi ini ditangani oleh init tahap pertama.

Bagian berikut menjelaskan persyaratan sistem sebagai root untuk OTA khusus sistem, memberikan panduan tentang memperbarui perangkat untuk menggunakan sistem sebagai root (termasuk perubahan tata letak partisi dan persyaratan kernel dm-verity). Untuk rincian tentang perubahan ramdisk, lihat Ramdisk Partisi .

Tentang OTA khusus sistem

Sistem-satunya OTAs, yang memungkinkan rilis Android update system.img dan product.img tanpa mengubah partisi lain, memerlukan tata letak partisi sistem-sebagai-root. Semua perangkat yang menjalankan Android 10 harus menggunakan tata letak partisi sistem sebagai root untuk mengaktifkan OTA khusus sistem.

  • Sebuah perangkat / B, yang me-mount system partisi sebagai rootfs, sudah menggunakan sistem-sebagai-root dan tidak memerlukan perubahan OTAs sistem pendukung.
  • Non-A / perangkat B, yang me-mount system partisi di /system , harus diperbarui untuk menggunakan layout partisi sistem-sebagai-root untuk OTAs sistem pendukung.

Untuk rincian tentang A / B dan non-A / perangkat B, lihat A / B (Seamless) Sistem Updates .

Menggunakan hamparan vendor

Vendor overlay memungkinkan Anda untuk overlay perubahan pada vendor partisi pada saat perangkat boot. Sebuah vendor overlay adalah satu set modul vendor di product partisi yang mendapatkan overlay pada vendor partisi saat booting perangkat, mengganti dan menambah modul yang ada.

Saat booting perangkat, yang init proses melengkapi tahap pertama me-mount dan membaca sifat default. Kemudian mencari /product/vendor_overlay/<target_vendor_version> dan gunung setiap subdirektori pada yang sesuai vendor direktori partisi, jika kondisi berikut terpenuhi:

  • /vendor/<overlay_dir> ada.
  • /product/vendor_overlay/<target_vendor_version>/<overlay_dir> memiliki konteks file yang sama seperti /vendor/<overlay_dir> .
  • init diperbolehkan untuk me-mount pada konteks file /vendor/<overlay_dir> .

Menerapkan overlay vendor

Instal file overlay penjual di /product/vendor_overlay/<target_vendor_version> . File-file overlay vendor partisi saat booting perangkat, menggantikan file dengan nama yang sama dan menambahkan file baru. Vendor overlay tidak dapat menghapus file dari vendor partisi.

File Vendor overlay harus memiliki konteks file yang sama dengan file sasaran mereka mengganti di vendor partisi. Secara default, file-file di /product/vendor_overlay/<target_vendor_version> direktori memiliki vendor_file konteks. Jika ada ketidakcocokan konteks file antara file overlay vendor dan file yang diganti, tentukan itu dalam kebijakan khusus perangkat. Konteks file diatur pada tingkat direktori. Jika konteks file direktori overlay vendor tidak cocok dengan direktori target, dan konteks file yang benar tidak ditentukan dalam kebijakan khusus perangkat, direktori overlay vendor tersebut tidak di-overlay ke direktori target.

Untuk penggunaan penjual overlay, kernel harus mengaktifkan OverlayFS dengan menetapkan CONFIG_OVERLAY_FS=y . Juga, kernel harus digabung dari kernel umum 4.4 atau yang lebih baru, atau ditambal dengan "overlayfs: override_creds=off option bypass creator_cred" .

Contoh implementasi overlay vendor

Prosedur ini menunjukkan menerapkan overlay vendor yang overlay direktori /vendor/lib/* , /vendor/etc/* , dan /vendor/app/* .

  1. Menambahkan file penjual prebuilt di device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/ :

    device/google/device/vendor_overlay/28/lib/libfoo.so
    device/google/device/vendor_overlay/28/lib/libbar.so
    device/google/device/vendor_overlay/28/etc/baz.xml
    device/google/device/vendor_overlay/28/app/qux.apk
    
  2. Menginstal file penjual prebuilt untuk product/vendor_overlay di device/google/device/device.mk :

    PRODUCT_COPY_FILES += \
        $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
    
  3. Mendefinisikan konteks berkas jika target vendor file partisi memiliki konteks selain vendor_file . Karena /vendor/lib/* kegunaan yang vendor_file konteks, contoh ini tidak termasuk direktori tersebut.

    Tambahkan baris berikut ke device/google/device-sepolicy/private/file_contexts :

    /(product|system/product)/vendor_overlay/[0-9]+/etc(/.*)?   u:object_r:vendor_configs_file:s0
    /(product|system/product)/vendor_overlay/[0-9]+/app(/.*)?   u:object_r:vendor_app_file:s0
    
  4. Biarkan init proses untuk me-mount vendor overlay pada file konteks selain vendor_file . Karena init proses yang sudah memiliki izin untuk me-mount pada vendor_file konteks, contoh ini tidak mendefinisikan kebijakan untuk vendor_file .

    Tambahkan baris berikut ke device/google/device-sepolicy/public/init.te :

    allow init vendor_configs_file:dir mounton;
    allow init vendor_app_file:dir mounton;
    

Memvalidasi hamparan vendor

Untuk memvalidasi vendor konfigurasi overlay, menambahkan file di /product/vendor_overlay/<target_vendor_version>/<overlay_dir> dan memeriksa apakah file tersebut overlay pada file dalam /vendor/<overlay_dir> .

Untuk userdebug membangun, ada modul tes untuk atest :

$ atest -v fs_mgr_vendor_overlay_test

Memperbarui ke sistem-sebagai-root

Untuk memperbarui perangkat non-A / B dengan penggunaan sistem-sebagai-root, Anda harus memperbarui skema partisi untuk boot.img dan system.img , mengatur dm-kejujuran, dan menghapus setiap booting dependensi pada folder akar khusus perangkat.

Memperbarui partisi

Tidak seperti A / perangkat B yang Repurpose /boot sebagai pemulihan partisi, non-A / perangkat B harus menjaga /recovery partisi terpisah karena mereka tidak memiliki partisi Slot fallback (misalnya, dari boot_a ke boot_b ). Jika /recovery dihapus non-Sebuah perangkat / B dan dibuat mirip dengan skema A / B, recovery mode bisa istirahat selama update gagal ke /boot partisi. Untuk alasan ini, /recovery partisi harus partisi terpisah dari /boot untuk / perangkat non-A B, yang menyiratkan bahwa citra pemulihan akan terus diperbarui dengan cara ditangguhkan (yaitu, sama seperti di perangkat yang menjalankan Android 8.1.0 atau lebih rendah).

Tabel berikut mencantumkan perbedaan partisi gambar untuk perangkat non-A/B sebelum dan sesudah Android 9.

Gambar Ramdisk (sebelum 9) Sistem-sebagai-root (setelah 9)
boot.img Berisi kernel dan ramdisk.img :
ramdisk.img
  -/
    - init.rc
    - init
    - etc -> /system/etc
    - system/ (mount point)
    - vendor/ (mount point)
    - odm/ (mount point)
    ...
Berisi kernel boot normal saja.
recovery.img Berisi kernel pemulihan dan pemulihan ramdisk.img .
system.img Berisi berikut:
system.img
  -/
    - bin/
    - etc
    - vendor -> /vendor
    - ...
Berisi konten digabung asli system.img dan ramdisk.img :
system.img
  -/
    - init.rc
    - init
    - etc -> /system/etc
    - system/
      - bin/
      - etc/
      - vendor -> /vendor
      - ...
    - vendor/ (mount point)
    - odm/ (mount point)
    ...

Partisi itu sendiri tidak berubah; baik ramdisk dan system-as-root menggunakan skema partisi berikut:

  • /boot
  • /system
  • /system
  • /recovery
  • /vendor , dll

Menyiapkan dm-verity

Dalam sistem-sebagai-root, kernel harus me-mount system.img bawah / (mount point) dengan dm-kejujuran . AOSP mendukung implementasi dm-kebenaran berikut untuk system.img .

vboot 1.0

Untuk vboot 1.0 , kernel harus mengurai Android spesifik metadata pada /system , kemudian dikonversi ke dm-kebenaran params untuk mengatur dm-kebenaran (memerlukan patch kernel ini ). Contoh berikut menunjukkan pengaturan terkait dm-verity untuk system-as-root di baris perintah kernel:

ro root=/dev/dm-0 rootwait skip_initramfs init=/init
dm="system none ro,0 1 android-verity /dev/sda34"
veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f

vboot 2.0

Untuk vboot 2.0 ( AVB ), bootloader harus mengintegrasikan eksternal / AVB / libavb , yang kemudian mem-parsing descriptor hashtree untuk /system , bertobat kepada dm-kebenaran params , dan akhirnya melewati params ke kernel melalui baris perintah kernel. (Hashtree deskriptor dari /system mungkin di /vbmeta atau /system itu sendiri.)

vboot 2.0 memerlukan patch kernel berikut:

Contoh berikut menunjukkan pengaturan terkait dm-verity untuk system-as-root di baris perintah kernel:

ro root=/dev/dm-0 rootwait  skip_initramfs init=/init

dm="1 vroot none ro 1,0 5159992 verity 1
PARTUUID=00000016-0000-0000-0000-000000000000
PARTUUID=00000016-0000-0000-0000-000000000000 4096 4096 644999 644999
sha1 d80b4a8be3b58a8ab86fad1b498640892d4843a2
8d08feed2f55c418fb63447fec0d32b1b107e42c 10 restart_on_corruption
ignore_zero_blocks use_fec_from_device
PARTUUID=00000016-0000-0000-0000-000000000000 fec_roots 2 fec_blocks
650080 fec_start 650080"

Menggunakan folder root khusus perangkat

Dengan sistem-sebagai-root, setelah sistem generik gambar (GSI) yang melintas pada perangkat (dan sebelum menjalankan Penjual Test Suite tes), folder akar khusus perangkat ditambah dengan BOARD_ROOT_EXTRA_FOLDERS hilang karena seluruh konten direktori root telah diganti oleh sistem-sebagai-root GSI. Penghapusan folder ini dapat menyebabkan perangkat menjadi tidak dapat di-boot jika ada ketergantungan pada folder akar khusus perangkat (misalnya, folder tersebut digunakan sebagai titik pemasangan).

Untuk menghindari masalah ini, jangan gunakan BOARD_ROOT_EXTRA_FOLDERS untuk menambahkan folder akar khusus perangkat. Jika Anda perlu menentukan khusus perangkat mount point, penggunaan /mnt/vendor/<mount point> (ditambahkan dalam ini changelists ). Ini khusus vendor mount point dapat langsung ditentukan baik di fstab pohon perangkat (untuk tahap pertama me-mount) dan /vendor/etc/fstab.{ro.hardware} berkas tanpa pengaturan tambahan (sebagai fs_mgr menciptakan mereka di bawah /mnt/vendor/* otomatis).