Partisi booting umum

Di Android 12, image boot generik, yang disebut sebagai Gambar Kernel Generik (GKI), berisi ramdisk generik dan {i>kernel<i} GKI.

Untuk perangkat yang diluncurkan dengan Android 13, ramdisk dihapus dari image boot dan ditempatkan di init_boot terpisah gambar. Perubahan ini membuat gambar boot hanya memiliki Kernel GKI.

Untuk mengupgrade perangkat yang terus menggunakan Android 12 atau versi {i>kernel<i} yang lebih lama, {i> ramdisk<i} generik tetap di tempatnya tidak ada persyaratan untuk gambar init_boot baru.

Untuk membangun ramdisk generik, pindahkan resource khusus vendor keluar dari ramdisk sehingga ramdisk generik hanya berisi init tahap pertama dan properti yang berisi informasi stempel waktu.

Di perangkat yang:

  • Jangan gunakan partisi recovery khusus, semua bit pemulihan akan dipindahkan dari ramdisk generik ke ramdisk vendor_boot.

  • Gunakan partisi recovery khusus, tidak ada perubahan pada ramdisk recovery diperlukan karena ramdisk recovery bersifat mandiri.

Arsitektur

Diagram berikut mengilustrasikan arsitektur untuk perangkat yang menjalankan Android 12 dan lebih tinggi. Peluncuran perangkat dengan Android 13 memiliki Gambar init_boot yang berisi ramdisk generik. Perangkat yang diupgrade dari Android 12 ke Android 13 menggunakan arsitektur yang sama seperti pada Android 12.

Luncurkan dengan Android 13, tanpa pemulihan khusus

Luncurkan/upgrade perangkat, GKI, tanpa pemulihan khusus

Gambar 1. Perangkat yang diluncurkan atau diupgrade ke Android 13, dengan GKI, tanpa pemulihan khusus.

Diluncurkan dengan Android 13, pemulihan A/B khusus dan A/B (ramdisk khusus)

Luncurkan/upgrade perangkat, GKI, pemulihan A/B khusus dan A/B

Gambar 2. Perangkat yang diluncurkan atau diupgrade ke Android 13, dengan GKI, khusus, dan pemulihan A/B.

Lihat gambar ini jika perangkat memiliki partisi recovery_a dan recovery_b.

Diluncurkan dengan Android 13, pemulihan khusus dan non-A/B (ramdisk khusus)

Meluncurkan/mengupgrade perangkat, GKI, pemulihan khusus dan non-A/B

Gambar 3. Perangkat yang diluncurkan atau diupgrade ke Android 13, dengan GKI, pemulihan khusus dan non-A/B.

Lihat gambar ini jika perangkat memiliki partisi bernama recovery tanpa akhiran slot.

Luncurkan atau upgrade ke Android 12, tanpa pemulihan khusus

Luncurkan/upgrade perangkat, GKI, tanpa pemulihan khusus

Gambar 4. Perangkat yang diluncurkan atau diupgrade ke Android 12, dengan GKI, tanpa pemulihan khusus.

Luncurkan atau upgrade ke Android 12, pemulihan A/B khusus dan A/B (ramdisk khusus)

Luncurkan/upgrade perangkat, GKI, pemulihan A/B khusus dan A/B

Gambar 5. Perangkat yang diluncurkan atau diupgrade ke Android 12, dengan GKI, khusus, dan pemulihan A/B.

Lihat gambar ini jika perangkat memiliki partisi recovery_a dan recovery_b.

Luncurkan atau upgrade ke Android 12, pemulihan khusus dan non-A/B (ramdisk khusus)

Meluncurkan/mengupgrade perangkat, GKI, pemulihan khusus dan non-A/B

Gambar 6. Perangkat yang diluncurkan atau diupgrade ke Android 12, dengan GKI, pemulihan khusus dan non-A/B.

Lihat gambar ini jika perangkat memiliki partisi bernama recovery tanpa akhiran slot.

Upgrade ke Android 12, recovery-as-boot (recovery-as-ramdisk)

Luncurkan/upgrade perangkat, tanpa GKI, recovery-as-boot

Gambar 7. Perangkat yang diupgrade ke Android 12, tanpa GKI, recovery-as-boot.

Upgrade ke Android 12, pemulihan khusus (ramdisk khusus)

Meluncurkan/mengupgrade perangkat, tanpa GKI, pemulihan khusus

Gambar 8. Perangkat yang diupgrade ke Android 12, tanpa GKI, pemulihan khusus.

Konten image booting

Booting Android berisi hal berikut.

  • init_boot gambar ditambahkan untuk perangkat yang diluncurkan dengan Android 13

    • Versi header V4
    • Image ramdisk generik
  • Gambar generik boot

    • Header versi V3 atau V4
      • boot_signature untuk sertifikasi boot.img GKI (khusus v4). Tujuan GKI tersertifikasi boot.img tidak ditandatangani untuk booting terverifikasi. OEM harus tetap menandatangani boot.img bawaan dengan metode AVB tombol.
      • cmdline umum (GENERIC_KERNEL_CMDLINE)
      • Kernel GKI
    • Image ramdisk generik
      • Hanya disertakan dalam boot gambar dari Android 12 dan sebelumnya
  • Image vendor_boot (untuk detailnya, lihat Booting Vendor Partisi)

    • Header vendor_boot
      • cmdline khusus perangkat (BOARD_KERNEL_CMDLINE)
    • Gambar ramdisk vendor_boot
      • lib/modules
      • Resource pemulihan (jika tidak ada pemulihan khusus)
    • Gambar dtb
  • Gambar recovery

    • Header versi V2
      • cmdline khusus perangkat untuk pemulihan, jika diperlukan
      • Untuk partisi pemulihan non-A/B, isi header harus berupa mandiri; lihat Gambar Pemulihan. Contoh:
      • cmdline tidak disambungkan ke boot dan vendor_boot cmdline.
      • Header menentukan DTBO pemulihan, jika diperlukan.
      • Untuk partisi pemulihan A/B, konten dapat digabungkan atau disimpulkan dari boot dan vendor_boot. Contoh:
      • cmdline disambungkan ke boot dan vendor_boot cmdline.
      • DTBO dapat disimpulkan dari header vendor_boot.
    • Gambar ramdisk recovery
      • Referensi pemulihan
      • Untuk partisi pemulihan non-A/B, isi ramdisk harus mandiri; lihat Gambar Pemulihan. Contoh:
      • lib/modules harus berisi semua modul kernel yang diperlukan untuk melakukan booting mode pemulihan
      • Ramdisk pemulihan harus berisi init.
      • Untuk partisi pemulihan A/B, ramdisk pemulihan ditambahkan ke generik dan ramdisk vendor_boot, sehingga tidak perlu mandiri. Contoh:
      • lib/modules mungkin hanya berisi modul kernel tambahan yang diperlukan untuk mode pemulihan {i>boot<i} selain modul {i> kernel<i} di ramdisk vendor_boot.
      • Symlink di /init mungkin ada, tetapi dibayangi oleh biner /init tahap pertama dalam image booting.

Konten image ramdisk umum

Ramdisk generik berisi komponen berikut.

  • init
  • system/etc/ramdisk/build.prop
  • ro.PRODUCT.bootimg.* build properti
  • Direktori kosong untuk titik pemasangan: debug_ramdisk/, mnt/, dev/, sys/, proc/, metadata/
  • first_stage_ramdisk/
    • Direktori kosong duplikat untuk titik pemasangan: debug_ramdisk/, mnt/, dev/, sys/, proc/, metadata/

Integrasi image booting

Flag build mengontrol cara init_boot, boot, recovery, dan vendor_boot image dasar dibangun. Nilai variabel papan boolean harus berupa string true atau kosong (yang merupakan default).

  • TARGET_NO_KERNEL. Variabel ini menunjukkan apakah build menggunakan boot bawaan gambar. Jika variabel ini ditetapkan ke true, tetapkan BOARD_PREBUILT_BOOTIMAGE ke lokasi boot image bawaan (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img)

  • BOARD_USES_RECOVERY_AS_BOOT. Variabel ini menunjukkan apakah perangkat menggunakan gambar recovery sebagai gambar boot. Saat menggunakan GKI, variabel ini resource kosong dan pemulihan harus dipindahkan ke vendor_boot.

  • BOARD_USES_GENERIC_KERNEL_IMAGE. Variabel ini menunjukkan bahwa {i>board <i}menggunakan GKI. Variabel ini tidak mempengaruhi {i>sysprops<i} atau PRODUCT_PACKAGES.

    Ini adalah {i>switch<i} GKI tingkat dewan; semua variabel berikut dibatasi oleh variabel ini.

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. Variabel ini mengontrol apakah resource pemulihan ramdisk di-build ke vendor_boot.

    • Jika disetel ke true, resource pemulihan akan dibuat hanya untuk vendor-ramdisk/ dan tidak dibuat untuk recovery/root/.

    • Jika kosong, resource pemulihan hanya di-build untuk recovery/root/ dan tidak dibuat untuk vendor-ramdisk/.

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. Variabel ini mengontrol apakah GSI Tombol AVB dibuat untuk vendor_boot.

    • Jika ditetapkan ke true, jika BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:

      • Jika disetel, kunci AVB GSI dibuat untuk $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb.

      • Jika tidak disetel, kunci AVB GSI dibuat untuk $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.

    • Saat kosong, jika BOARD_RECOVERY_AS_ROOT:

      • Jika disetel, kunci AVB GSI dibuat untuk $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb.

      • Jika tidak disetel, kunci AVB GSI dibuat untuk $ANDROID_PRODUCT_OUT/ramdisk/avb.

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. Variabel ini mengontrol apakah Gambar recovery berisi kernel atau tidak. Peluncuran perangkat dengan Android 12 dan menggunakan partisi recovery A/B harus menyetelnya variabel ke true. Perangkat yang diluncurkan dengan Android 12 dan penggunaan non-A/B harus menetapkan variabel ini ke false untuk mempertahankan gambar pemulihan mandiri.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. Variabel ini mengontrol apakah $OUT/boot*.img disalin ke IMAGES/ pada file target.

    • aosp_arm64 harus menetapkan variabel ini ke true.

    • Perangkat lain harus mengosongkan variabel ini.

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. Variabel ini mengontrol apakah init_boot.img akan dibuat dan menetapkan ukurannya. Jika disetel, ramdisk generik ditambahkan ke init_boot.img, bukan boot.img, dan memerlukan BOARD_AVB_INIT_BOOT* variabel yang akan ditetapkan vbmeta berantai.

Kombinasi yang diizinkan

Komponen atau variabel Mengupgrade perangkat tanpa partisi pemulihan Mengupgrade perangkat dengan partisi pemulihan Luncurkan perangkat tanpa partisi pemulihan Luncurkan perangkat dengan partisi pemulihan A/B Luncurkan perangkat dengan partisi pemulihan non-A/B AOS_arm64
Berisi boot ya ya ya ya ya ya
Berisi init_boot (Android 13) belum tidak ya ya ya ya
Berisi vendor_boot opsional opsional ya ya ya belum
Berisi recovery belum ya belum ya ya belum
BOARD_USES_RECOVERY_AS_BOOT true kosong kosong kosong kosong kosong
BOARD_USES_GENERIC_KERNEL_IMAGE kosong kosong true true true true
PRODUCT_BUILD_RECOVERY_IMAGE kosong true atau kosong kosong true atau kosong true atau kosong kosong
BOARD_RECOVERYIMAGE_PARTITION_SIZE kosong > 0 kosong > 0 > 0 kosong
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT kosong kosong true kosong kosong kosong
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT kosong kosong true true true kosong
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE kosong kosong kosong true kosong kosong
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES kosong kosong kosong kosong kosong true

Perangkat dengan partisi recovery khusus dapat disetel PRODUCT_BUILD_RECOVERY_IMAGE ke true atau kosong. Untuk perangkat ini, jika BOARD_RECOVERYIMAGE_PARTITION_SIZE disetel, image recovery akan dibuat.

Mengaktifkan vbmeta berantai untuk booting

Vbmeta berantai harus diaktifkan untuk gambar boot dan init_boot. Menentukan hal berikut:

BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2

BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3

Misalnya, lihat mengubah.

Sistem sebagai root

System-as-root tidak didukung untuk perangkat yang menggunakan GKI. Aktif perangkat tersebut, BOARD_BUILD_SYSTEM_ROOT_IMAGE harus kosong. Sistem sebagai root juga tidak didukung untuk perangkat yang menggunakan partisi dinamis.

Konfigurasi produk

Perangkat yang menggunakan ramdisk generik harus menginstal daftar file yang diizinkan untuk diinstal ke ramdisk. Untuk melakukannya, tentukan hal berikut di device.mk:

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

File generic_ramdisk.mk juga mencegah makefile lain secara tidak sengaja menginstal file lain ke ramdisk (memindahkan file tersebut ke vendor_ramdisk ).

Menyiapkan perangkat

Petunjuk penyiapan berbeda-beda di setiap perangkat yang diluncurkan dengan Android 13, mengupgrade ke Android 12, dan meluncurkan dengan Android 12. Android 13, penyiapannya mirip dengan Android 12

  • Perangkat yang Melakukan Upgrade ke Android 12:

    • Dapat mempertahankan nilai BOARD_USES_RECOVERY_AS_BOOT. Jika mereka melakukannya, mereka menggunakan konfigurasi lama dan variabel build baru harus kosong. Jika seperti perangkat:

      • Setel BOARD_USES_RECOVERY_AS_BOOT ke true, arsitekturnya adalah sebagai yang ditunjukkan pada Gambar 3.

      • Setel BOARD_USES_RECOVERY_AS_BOOT ke kosong, arsitektur akan ditampilkan seperti yang ditunjukkan. Gambar 4.

    • Dapat menetapkan BOARD_USES_RECOVERY_AS_BOOT ke kosong. Jika mereka melakukannya, mereka menggunakan konfigurasi baru. Jika perangkat tersebut:

      • Jangan gunakan partisi recovery khusus, arsitekturnya akan ditampilkan seperti yang ditunjukkan di Gambar 1 dan opsi penyiapan perangkat adalah Option 1.

      • Gunakan partisi recovery khusus, arsitekturnya seperti yang ditunjukkan di Gambar 2a atau Gambar 2b dan penyiapan perangkat adalah Opsi 2a atau Opsi 2b.

  • Perangkat yang diluncurkan dengan Android 12 harus disetel BOARD_USES_RECOVERY_AS_BOOT untuk mengosongkan dan menggunakan konfigurasi baru. Jika seperti perangkat:

    • Jangan gunakan partisi recovery khusus, arsitekturnya seperti yang ditunjukkan di Gambar 1 dan opsi penyiapan perangkat adalah Opsi 1.

    • Gunakan partisi recovery khusus, arsitekturnya seperti yang ditunjukkan di Gambar 2a atau Gambar 2b dan penyiapan perangkat adalah Opsi 2a atau Opsi 2b.

Karena aosp_arm64 hanya membangun GKI (dan bukan vendor_boot atau pemulihan), kode ini bukan target lengkap. Untuk aosp_arm64konfigurasi build, lihat generic_arm64.

Opsi 1: Tidak ada partisi pemulihan khusus

Perangkat tanpa partisi recovery berisi image boot generik dalam Partisi boot. Ramdisk vendor_boot berisi semua sumber daya pemulihan, termasuk lib/modules (dengan modul kernel vendor). Pada perangkat tersebut, konfigurasi produk yang diwarisi dari generic_ramdisk.mk.

Menetapkan nilai BOARD

Tetapkan nilai berikut:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

Ramdisk vendor_boot dapat berisi symlink /init hingga /system/bin/init, dan init_second_stage.recovery pukul /system/bin/init. Namun, karena ramdisk generik yang disambungkan setelah ramdisk vendor_boot, /init {i>symlink<i} akan ditimpa. Saat perangkat melakukan booting ke pemulihan, Biner /system/bin/init diperlukan untuk mendukung init tahap kedua. Isi dari vendor_boot + ramdisk generik adalah sebagai berikut:

  • /init (dari ramdisk umum, dibuat dari init_first_stage)
  • /system/bin/init (dari vendor_ramdisk, dibuat dari init_second_stage.recovery)

Memindahkan file fstab

Pindahkan file fstab apa pun yang diinstal ke ramdisk generik ke vendor_ramdisk. Misalnya, lihat mengubah.

Menginstal modul

Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk (lewati langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal).

  • Gunakan varian vendor_ramdisk dari modul saat modul diinstal ke /first_stage_ramdisk. Modul ini akan tersedia setelah init mengalihkan root ke /first_stage_ramdisk tetapi sebelum init mengalihkan root ke /system. Misalnya, lihat Checksum metadata dan Kompresi A/B virtual.

  • Gunakan varian recovery dari modul saat modul diinstal ke /. Modul ini harus tersedia sebelum init mengalihkan root ke /first_stage_ramdisk. Untuk detail tentang cara menginstal modul ke /, lihat Pertama konsol stage.

Konsol tahap pertama

Karena konsol tahap pertama dimulai sebelum init mengalihkan root ke /first_stage_ramdisk, Anda harus menginstal varian modul recovery. Secara {i>default<i}, kedua varian modul diinstal ke build/make/target/product/base_vendor.mk, jadi jika makefile perangkat mewarisi dari file tersebut, Anda tidak perlu menginstal varian recovery secara eksplisit.

Untuk menginstal modul pemulihan secara eksplisit, gunakan langkah berikut.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

Hal ini memastikan bahwa linker, sh, dan toybox diinstal ke $ANDROID_PRODUCT_OUT/recovery/root/system/bin, yang kemudian diinstal ke /system/bin di bawah vendor_ramdisk.

Guna menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), gunakan mengikuti.

PRODUCT_PACKAGES += adbd.recovery

Cara ini memastikan bahwa modul yang ditentukan diinstal ke $ANDROID_PRODUCT_OUT/recovery/root/system/bin, yang kemudian diinstal ke /system/bin di bawah vendor_ramdisk.

Checksum metadata

Untuk mendukung metadata checksum selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal ramdisk varian dari modul berikut. Guna menambahkan dukungan untuk GKI, pindahkan modul ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

Misalnya, lihat daftar perubahan.

Kompresi A/B virtual

Untuk mendukung kompresi A/B virtual, snapuserd harus diinstal ke vendor_ramdisk. Perangkat harus mewarisi dari virtual_ab_ota/compression.mk, yang menginstal varian vendor_ramdisk dari snapuserd.

Perubahan pada proses booting

Proses {i>booting<i} ke pemulihan atau ke Android tidak berubah, dengan pengecualian berikut:

  • Ramdisk build.prop bergerak ke /second_stage_resources sehingga tahap kedua init dapat membaca stempel waktu build booting.

Karena resource dipindahkan dari ramdisk generik ke ramdisk vendor_boot, hasil penggabungan ramdisk generik ke ramdisk vendor_boot tidak berubah.

Sediakan e2fsck

Makefile perangkat dapat mewarisi dari:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk jika perangkat mendukung virtual A/B tetapi bukan kompresi.

  • virtual_ab_ota/compression.mk jika perangkat mendukung A/B virtual kompresi data.

Penginstalan makefile produk $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck. Di saat runtime, tahap pertama init akan mengalihkan root menjadi /first_stage_ramdisk, lalu mengeksekusi /system/bin/e2fsck.

Opsi 2a: Partisi pemulihan A/B dan khusus

Gunakan opsi ini untuk perangkat dengan partisi recovery A/B; yaitu, perangkat memiliki recovery_a dan recovery_b partition. Perangkat tersebut mencakup Perangkat A/B dan A/B Virtual yang partisi pemulihannya dapat diperbarui, dengan konfigurasi berikut:

AB_OTA_PARTITIONS += recovery

Ramdisk vendor_boot berisi bit vendor dari ramdisk dan vendor modul {i>kernel<i}, termasuk yang berikut ini:

  • File fstab khusus perangkat

  • lib/modules (termasuk modul kernel vendor)

Ramdisk recovery berisi semua resource pemulihan. Pada perangkat tersebut, konfigurasi produk yang diwarisi dari generic_ramdisk.mk.

Menetapkan nilai BOARD

Tetapkan nilai berikut untuk perangkat dengan partisi recovery A/B:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

Ramdisk recovery dapat berisi symlink /init -> /system/bin/init, dan init_second_stage.recovery pukul /system/bin/init. Namun, karena booting ramdisk digabungkan setelah ramdisk recovery, symlink /init akan ditimpa. Saat perangkat melakukan booting ke mode pemulihan, /system/bin/init biner diperlukan untuk mendukung init tahap kedua.

Saat perangkat melakukan booting ke recovery, konten dari recovery + vendor_boot + ramdisk umum adalah sebagai berikut:

  • /init (dari ramdisk, dibuat dari init_first_stage)
  • /system/bin/init (dari recovery ramdisk, dibuat dari init_second_stage.recovery, dan dieksekusi dari /init)

Saat perangkat melakukan booting ke Android, konten vendor_boot + generik ramdisk adalah sebagai berikut:

  • /init (dari ramdisk umum, dibuat dari init_first_stage)

Memindahkan file fstab

Pindahkan file fstab apa pun yang diinstal ke ramdisk umum ke vendor_ramdisk. Misalnya, lihat mengubah.

Menginstal modul

Atau, Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk (lewati langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal). Init tidak mengganti {i>root<i}. Varian vendor_ramdisk modul diinstal ke root dari vendor_ramdisk. Misalnya cara menginstal modul untuk vendor_ramdisk, lihat Konsol tahap pertama, Metadata checksums, dan A/B Virtual kompresi.

Konsol tahap pertama

Untuk menginstal varian vendor_ramdisk dari modul, gunakan hal berikut:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Hal ini memastikan bahwa linker, sh, dan toybox diinstal ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, yang kemudian diinstal ke /system/bin di bawah vendor_ramdisk.

Guna menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), aktifkan varian vendor_ramdisk dari modul ini dengan mengupload patch yang relevan ke AOSP, lalu gunakan yang berikut ini,

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Cara ini memastikan bahwa modul yang ditentukan diinstal ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin. Jika ramdisk vendor_boot dimuat dalam mode pemulihan, modul ini juga tersedia dalam recovery. Jika Ramdisk vendor_boot tidak dimuat dalam mode pemulihan, perangkat dapat memilih instal adbd.recovery juga.

Checksum metadata

Untuk mendukung metadata checksum selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal ramdisk varian dari modul berikut. Guna menambahkan dukungan untuk GKI, pindahkan modul ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

Misalnya, lihat daftar perubahan.

Kompresi A/B virtual

Untuk mendukung kompresi A/B Virtual, snapuserd harus diinstal ke vendor_ramdisk. Perangkat harus mewarisi dari virtual_ab_ota/compression.mk, yang menginstal varian vendor_ramdisk dari snapuserd.

Perubahan pada proses booting

Saat melakukan booting ke Android, proses booting tidak berubah. Tombol vendor_boot + ramdisk generik mirip dengan proses {i>booting<i} yang ada, hanya saja fstab pemuatan dari vendor_boot. Karena system/bin/recovery tidak ada, first_stage_init menanganinya sebagai booting normal.

Saat booting ke mode pemulihan, proses booting akan berubah. Tombol pemulihan + vendor_boot + ramdisk generik mirip dengan proses pemulihan yang ada, tetapi kernel dimuat dari gambar boot, bukan dari gambar recovery. Proses booting untuk mode pemulihan adalah sebagai berikut.

  1. Bootloader dimulai, lalu melakukan hal berikut:

    1. Mengirim pemulihan + vendor_boot + ramdisk generik ke /. (Jika OEM menduplikasi modul {i>kernel<i} dalam ramdisk pemulihan dengan menambahkannya ke BOARD_RECOVERY_KERNEL_MODULES), vendor_boot bersifat opsional.)
    2. Menjalankan kernel dari partisi boot.
  2. Kernel memasang ramdisk ke / lalu mengeksekusi /init dari ramdisk generik.

  3. Init tahap pertama dimulai, lalu melakukan hal berikut:

    1. Menetapkan IsRecoveryMode() == true dan ForceNormalBoot() == false.
    2. Memuat modul kernel vendor dari /lib/modules.
    3. Memanggil DoFirstStageMount() tetapi melewati pemasangan karena IsRecoveryMode() == true. (Perangkat tidak memiliki ramdisk yang kosong (karena / masih sama), tetapi memanggil SetInitAvbVersionInRecovery().)
    4. Memulai init tahap kedua dari /system/bin/init dari ramdisk recovery.

Sediakan e2fsck

Makefile perangkat dapat mewarisi dari:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk jika perangkat mendukung virtual A/B tetapi bukan kompresi.

  • virtual_ab_ota/compression.mk jika perangkat mendukung A/B virtual kompresi data.

Penginstalan makefile produk $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck. Di saat runtime, tahap pertama init akan mengeksekusi /system/bin/e2fsck.

Opsi 2b: Partisi pemulihan khusus dan non-A/B

Gunakan opsi ini untuk perangkat dengan partisi recovery non-A/B; yaitu, perangkat memiliki partisi bernama recovery tanpa akhiran slot. Perangkat tersebut termasuk:

  • perangkat non-A/B;
  • Perangkat A/B dan A/B Virtual yang partisi pemulihannya bukan dapat diperbarui. (Ini tidak biasa.)

Ramdisk vendor_boot berisi bit vendor dari ramdisk dan vendor modul {i>kernel<i}, termasuk yang berikut ini:

  • File fstab khusus perangkat
  • lib/modules (termasuk modul kernel vendor)

Gambar recovery harus bersifat mandiri. Harus berisi semua resource yang diperlukan untuk mem-booting mode pemulihan, termasuk:

  • Gambar kernel
  • Gambar DTBO
  • Modul kernel di lib/modules
  • Init tahap pertama sebagai symlink /init -> /system/bin/init
  • Biner init tahap kedua /system/bin/init
  • File fstab khusus perangkat
  • Semua resource pemulihan lainnya, termasuk biner recovery

Pada perangkat tersebut, konfigurasi produk mewarisi mulai dari generic_ramdisk.mk.

Menetapkan nilai BOARD

Tetapkan nilai berikut untuk perangkat non-A/B:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

Ramdisk recovery harus berisi symlink /init -> /system/bin/init, dan init_second_stage.recovery pukul /system/bin/init. Saat perangkat masuk ke mode pemulihan, biner /system/bin/init diperlukan untuk mendukung keduanya terlebih dahulu int Tahap kedua dan tahap kedua.

Saat perangkat di-booting ke recovery, konten ramdisk recovery akan sebagai berikut:

  • /init -> /system/bin/init (dari recovery ramdisk)
  • /system/bin/init (dari recovery ramdisk, dibuat dari init_second_stage.recovery, dan dieksekusi dari /init)

Saat perangkat melakukan booting ke Android, konten vendor_boot + generik ramdisk adalah sebagai berikut:

  • /init (dari ramdisk, dibuat dari init_first_stage)

Memindahkan file fstab

Pindahkan file fstab apa pun yang diinstal ke ramdisk umum ke ramdisk vendor_ramdisk dan recovery. Misalnya, lihat mengubah.

Menginstal modul

Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk dan RAMdisk recovery (lewati langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal). init tidak mengganti {i>root<i}. Varian vendor_ramdisk modul diinstal ke root dari vendor_ramdisk. Varian recovery modul diinstal ke root dari ramdisk recovery. Misalnya cara menginstal modul untuk Ramdisk vendor_ramdisk dan recovery, se Konsol tahap pertama dan Metadata checksum.

Konsol tahap pertama

Untuk menginstal varian vendor_ramdisk dari modul, gunakan hal berikut:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Hal ini memastikan bahwa linker, sh, dan toybox diinstal ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, yang kemudian diinstal ke /system/bin di bawah vendor_ramdisk.

Guna menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), aktifkan varian vendor_ramdisk dari modul ini dengan mengupload patch yang relevan ke AOSP, lalu gunakan yang berikut ini,

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Cara ini memastikan bahwa modul yang ditentukan diinstal ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin.

Untuk menginstal varian recovery dari modul, ganti vendor_ramdisk dengan recovery:

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
    adbd.recovery \

Checksum metadata

Untuk mendukung metadata checksum selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal ramdisk varian dari modul berikut. Guna menambahkan dukungan untuk GKI, pindahkan modul ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

Untuk mendukung checksum metadata selama pemasangan tahap pertama dalam pemulihan, aktifkan varian pemulihan dari modul ini dan menginstalnya juga.

Perubahan pada proses booting

Saat melakukan booting ke Android, proses booting tidak berubah. Tombol vendor_boot + ramdisk generik mirip dengan proses {i>booting<i} yang ada, hanya saja fstab pemuatan dari vendor_boot. Karena system/bin/recovery tidak ada, first_stage_init menanganinya sebagai booting normal.

Saat melakukan booting ke mode pemulihan, proses booting tidak berubah. Pemulihan {i>ramdisk<i} dimuat dengan cara yang sama seperti proses pemulihan yang ada. Kernel dimuat dari image recovery. Tujuan proses {i>booting<i} untuk mode pemulihan adalah sebagai berikut.

  1. Bootloader dimulai, lalu melakukan hal berikut:

    1. Mengirim ramdisk pemulihan ke /.
    2. Menjalankan kernel dari partisi recovery.
  2. Kernel memasang ramdisk ke / lalu mengeksekusi /init, yang merupakan symlink ke /system/bin/init dari ramdisk recovery.

  3. Init tahap pertama dimulai, lalu melakukan hal berikut:

    1. Menetapkan IsRecoveryMode() == true dan ForceNormalBoot() == false.
    2. Memuat modul kernel vendor dari /lib/modules.
    3. Memanggil DoFirstStageMount() tetapi melewati pemasangan karena IsRecoveryMode() == true. (Perangkat tidak memiliki ramdisk yang kosong (karena / masih sama), tetapi memanggil SetInitAvbVersionInRecovery().)
    4. Memulai init tahap kedua dari /system/bin/init dari ramdisk recovery.

Stempel waktu gambar booting

Kode berikut adalah contoh file stempel waktu gambar boot:

####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
  • Pada waktu build, file system/etc/ramdisk/build.prop ditambahkan ke class generik ramdisk. File ini berisi informasi stempel waktu build.

  • Saat runtime, tahap pertama init salinan dari ramdisk ke tmpfs sebelum mengosongkan ramdisk agar kedua tahap init dapat membaca file ini untuk menyetel properti stempel waktu gambar boot.