Partisi Boot Generik

Di Android 12, image boot generik, yang disebut Generic Kernel Image (GKI) , berisi ramdisk generik dan kernel GKI.

Untuk perangkat yang diluncurkan dengan Android 13, ramdisk generik dihapus dari image boot dan ditempatkan di image init_boot terpisah. Perubahan ini menyisakan image boot hanya dengan kernel GKI.

Untuk mengupgrade perangkat yang terus menggunakan Android 12 atau versi kernel yang lebih lama, ramdisk generik tetap berada di tempatnya tanpa memerlukan image init_boot baru.

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

Pada perangkat yang:

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

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

Arsitektur

Diagram berikut menggambarkan arsitektur untuk perangkat yang menjalankan Android 12 dan yang lebih baru. Perangkat yang diluncurkan dengan Android 13 memiliki image init_boot baru 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/tingkatkan perangkat, GKI, tanpa pemulihan khusus

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

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

Luncurkan/tingkatkan perangkat, GKI, khusus, dan pemulihan 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 .

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

Luncurkan/tingkatkan 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 tingkatkan ke Android 12, tanpa pemulihan khusus

Luncurkan/tingkatkan perangkat, GKI, tanpa pemulihan khusus

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

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

Luncurkan/tingkatkan perangkat, GKI, khusus, dan pemulihan 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 tingkatkan ke Android 12, pemulihan khusus dan non-A/B (ramdisk khusus)

Luncurkan/tingkatkan 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.

Tingkatkan ke Android 12, pemulihan-sebagai-boot (pemulihan-as-ramdisk)

Luncurkan/tingkatkan perangkat, tanpa GKI, pemulihan saat boot

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

Tingkatkan ke Android 12, pemulihan khusus (ramdisk khusus)

Luncurkan/tingkatkan perangkat, tanpa GKI, pemulihan khusus

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

Konten gambar boot

Gambar boot Android berisi yang berikut ini.

  • gambar init_boot ditambahkan untuk perangkat yang diluncurkan dengan Android 13

    • Versi tajuk V4
    • Gambar ramdisk generik
  • Gambar boot umum

    • Versi tajuk V3 atau V4
      • boot_signature untuk sertifikasi boot.img GKI (khusus v4). boot.img GKI bersertifikat tidak ditandatangani untuk boot terverifikasi. OEM masih harus menandatangani boot.img bawaan dengan kunci AVB khusus perangkat.
      • cmdline umum ( GENERIC_KERNEL_CMDLINE )
      • Kernel GKI
    • Gambar ramdisk generik
      • Hanya disertakan dalam image boot dari Android 12 dan versi lebih lama
  • gambar vendor_boot (untuk detailnya, lihat Partisi Boot Vendor )

    • tajuk vendor_boot
      • cmdline khusus perangkat ( BOARD_KERNEL_CMDLINE )
    • gambar ramdisk vendor_boot
      • lib/modules
      • Sumber daya pemulihan (jika tidak ada pemulihan khusus)
    • gambar dtb
  • gambar recovery

    • Versi tajuk V2
      • cmdline khusus perangkat untuk pemulihan, jika perlu
      • Untuk partisi pemulihan non-A/B, konten header harus mandiri; lihat Gambar Pemulihan . Misalnya:
      • cmdline tidak digabungkan dengan boot dan vendor_boot cmdline .
      • Header menentukan DTBO pemulihan, jika perlu.
      • Untuk partisi pemulihan A/B, konten dapat digabungkan atau disimpulkan dari boot dan vendor_boot . Misalnya:
      • cmdline digabungkan menjadi boot dan vendor_boot cmdline .
      • DTBO dapat disimpulkan dari header vendor_boot .
    • gambar ramdisk recovery
      • Sumber daya pemulihan
      • Untuk partisi pemulihan non-A/B, isi ramdisk harus mandiri; lihat Gambar Pemulihan . Misalnya:
      • lib/modules harus berisi semua modul kernel yang diperlukan untuk mem-boot mode pemulihan
      • Ramdisk pemulihan harus berisi init .
      • Untuk partisi pemulihan A/B, ramdisk pemulihan ditambahkan ke ramdisk generik dan vendor_boot , sehingga tidak perlu berdiri sendiri. Misalnya:
      • lib/modules mungkin hanya berisi modul kernel tambahan yang diperlukan untuk mem-boot mode pemulihan selain modul kernel di vendor_boot ramdisk.
      • Symlink di /init mungkin ada, tetapi dibayangi oleh biner /init tahap pertama di image boot.

Isi gambar ramdisk generik

Ramdisk generik berisi komponen-komponen berikut.

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

Integrasi gambar boot

Bendera build mengontrol bagaimana image init_boot , boot , recovery , dan vendor_boot dibuat. Nilai variabel papan boolean harus berupa string true atau kosong (yang merupakan default).

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

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

  • BOARD_USES_GENERIC_KERNEL_IMAGE . Variabel ini menunjukkan bahwa dewan menggunakan GKI. Variabel ini tidak memengaruhi sysprops atau PRODUCT_PACKAGES .

    Ini adalah saklar GKI tingkat dewan; semua variabel yang tercantum di bawah dibatasi oleh variabel ini.

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT . Variabel ini mengontrol apakah sumber daya pemulihan ramdisk dibuat untuk vendor_boot .

    • Jika disetel ke true , sumber daya pemulihan dibuat untuk vendor-ramdisk/ saja dan tidak dibuat untuk recovery/root/ .

    • Jika kosong, sumber daya pemulihan dibuat untuk recovery/root/ saja dan tidak dibuat untuk vendor-ramdisk/ .

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

    • Jika disetel ke true , if BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :

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

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

    • Saat kosong, if BOARD_RECOVERY_AS_ROOT :

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

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

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE . Variabel ini mengontrol apakah image recovery berisi kernel atau tidak. Perangkat yang diluncurkan dengan Android 12 dan menggunakan partisi recovery A/B harus menyetel variabel ini ke true . Perangkat yang diluncurkan dengan Android 12 dan menggunakan non-A/B harus menyetel variabel ini ke false agar image pemulihan tetap mandiri.

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

    • aosp_arm64 harus menyetel variabel ini ke true .

    • Perangkat lain harus membiarkan variabel ini kosong.

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE . Variabel ini mengontrol apakah init_boot.img dibuat dan mengatur ukurannya. Ketika disetel, ramdisk generik ditambahkan ke init_boot.img alih-alih boot.img dan mengharuskan variabel BOARD_AVB_INIT_BOOT* disetel untuk vbmeta berantai

Kombinasi yang diperbolehkan

Komponen atau variabel Memutakhirkan perangkat tanpa partisi recovery Meningkatkan perangkat dengan partisi recovery Luncurkan perangkat tanpa partisi recovery Luncurkan perangkat dengan partisi recovery A/B Luncurkan perangkat dengan partisi recovery non-A/B aosp_arm64
Berisi boot Ya Ya Ya Ya Ya Ya
Berisi init_boot (Android 13) TIDAK TIDAK Ya Ya Ya Ya
Berisi vendor_boot opsional opsional Ya Ya Ya TIDAK
Berisi recovery TIDAK Ya TIDAK Ya Ya TIDAK
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 menyetel PRODUCT_BUILD_RECOVERY_IMAGE ke true atau kosong. Untuk perangkat ini, jika BOARD_RECOVERYIMAGE_PARTITION_SIZE disetel, citra recovery akan dibuat.

Aktifkan vbmeta berantai untuk boot

Vbmeta berantai harus diaktifkan untuk image boot dan init_boot . Tentukan 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 perubahan ini .

Sistem-sebagai-root

System-as-root tidak didukung untuk perangkat yang menggunakan GKI. Pada perangkat tersebut, BOARD_BUILD_SYSTEM_ROOT_IMAGE harus kosong. System-as-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 menginstal file lain ke ramdisk secara tidak sengaja (pindahkan file tersebut ke vendor_ramdisk ).

Menyiapkan perangkat

Petunjuk penyiapan berbeda antara perangkat yang diluncurkan dengan Android 13, diupgrade ke Android 12, dan diluncurkan dengan Android 12. Android 13, disiapkan serupa dengan yang dilakukan dengan Android 12

  • Peningkatan Perangkat 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 perangkat tersebut:

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

      • Atur BOARD_USES_RECOVERY_AS_BOOT ke kosong, arsitekturnya seperti yang ditunjukkan Gambar 4 .

    • Dapat mengatur BOARD_USES_RECOVERY_AS_BOOT menjadi kosong. Jika mereka melakukannya, mereka menggunakan konfigurasi baru. Jika perangkat tersebut:

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

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

  • Perangkat yang diluncurkan dengan Android 12 harus menyetel BOARD_USES_RECOVERY_AS_BOOT ke kosong dan menggunakan konfigurasi baru. Jika perangkat tersebut:

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

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

Karena aosp_arm64 hanya membuat GKI (dan bukan vendor_boot atau pemulihan), ini bukanlah target yang lengkap. Untuk konfigurasi build aosp_arm64 , lihat generic_arm64 .

Opsi 1: Tidak ada partisi pemulihan khusus

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

Menetapkan nilai PAPAN

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 di /system/bin/init . Namun, karena ramdisk generik digabungkan setelah ramdisk vendor_boot , symlink /init akan ditimpa. Saat perangkat melakukan booting ke pemulihan, biner /system/bin/init diperlukan untuk mendukung init tahap kedua. Isi vendor_boot + ramdisk generik adalah sebagai berikut:

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

Memindahkan file fstab

Pindahkan semua file fstab yang diinstal ke ramdisk generik ke vendor_ramdisk . Misalnya, lihat perubahan ini .

Memasang modul

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

  • Gunakan varian modul vendor_ramdisk saat modul diinstal ke /first_stage_ramdisk . Modul ini harus 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 modul ketika modul diinstal ke / . Modul ini harus tersedia sebelum init mengalihkan root ke /first_stage_ramdisk . Untuk rincian tentang pemasangan modul ke / , lihat Konsol tahap pertama .

Konsol tahap pertama

Karena konsol tahap pertama dimulai sebelum init mengalihkan root ke /first_stage_ramdisk , Anda perlu menginstal varian modul recovery . Secara default, 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 yang berikut ini.

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 .

Untuk menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), gunakan yang berikut ini.

PRODUCT_PACKAGES += adbd.recovery

Hal 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 checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan pada 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 \

Sebagai contoh, lihat daftar perubahan ini .

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 booting ke recovery atau ke Android tidak berubah, dengan pengecualian sebagai berikut:

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

Karena sumber daya berpindah dari ramdisk generik ke ramdisk vendor_boot , hasil penggabungan ramdisk generik ke ramdisk vendor_boot tidak berubah.

Membuat e2fsck tersedia

Makefile perangkat dapat diwarisi dari:

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

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

Makefile produk dipasang $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck . Saat runtime, tahap pertama init mengalihkan root ke /first_stage_ramdisk lalu mengeksekusi /system/bin/e2fsck .

Opsi 2a: Partisi khusus dan pemulihan A/B

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

AB_OTA_PARTITIONS += recovery

Ramdisk vendor_boot berisi bit vendor dari modul ramdisk dan kernel vendor, termasuk yang berikut ini:

  • File fstab khusus perangkat

  • lib/modules (termasuk modul kernel vendor)

Ramdisk recovery berisi semua sumber daya pemulihan. Pada perangkat tersebut, konfigurasi produk mewarisi dari generic_ramdisk.mk .

Menetapkan nilai PAPAN

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 di /system/bin/init . Namun, karena ramdisk boot digabungkan setelah ramdisk recovery , symlink /init akan ditimpa. Saat perangkat melakukan booting ke mode pemulihan, biner /system/bin/init diperlukan untuk mendukung init tahap kedua.

Saat perangkat melakukan booting ke recovery , isi recovery + vendor_boot + ramdisk generik adalah sebagai berikut:

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

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

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

Memindahkan file fstab

Pindahkan semua file fstab yang diinstal ke ramdisk generik ke vendor_ramdisk . Misalnya, lihat perubahan ini .

Memasang modul

Jika diinginkan, Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk (lewati langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal). Init tidak mengganti root. Varian modul vendor_ramdisk dipasang ke akar vendor_ramdisk . Untuk contoh pemasangan modul ke vendor_ramdisk , lihat Konsol tahap pertama , Checksum metadata , dan kompresi A/B Virtual .

Konsol tahap pertama

Untuk menginstal varian modul vendor_ramdisk , gunakan yang berikut ini:

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 .

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

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Hal ini memastikan bahwa modul yang ditentukan diinstal ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin . Jika ramdisk vendor_boot dimuat dalam mode pemulihan, modul juga tersedia dalam recovery . Jika ramdisk vendor_boot tidak dimuat dalam mode pemulihan, perangkat juga dapat menginstal adbd.recovery secara opsional.

Checksum metadata

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

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

Sebagai contoh, lihat daftar perubahan ini .

Kompresi A/B virtual

Untuk mendukung kompresi Virtual A/B, 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 booting ke Android, proses bootingnya tidak berubah. vendor_boot + ramdisk generik mirip dengan proses boot yang ada, kecuali fstab dimuat dari vendor_boot . Karena system/bin/recovery tidak ada, first_stage_init menanganinya sebagai boot normal.

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

  1. Bootloader dimulai, lalu lakukan hal berikut:

    1. Mendorong pemulihan + vendor_boot + ramdisk generik ke / . (Jika OEM menduplikasi modul kernel di ramdisk pemulihan dengan menambahkannya ke BOARD_RECOVERY_KERNEL_MODULES ), vendor_boot bersifat opsional.)
    2. Menjalankan kernel dari partisi boot .
  2. Kernel memasang ramdisk ke / kemudian mengeksekusi /init dari ramdisk generik.

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

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

Membuat e2fsck tersedia

Makefile perangkat dapat diwarisi dari:

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

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

Makefile produk dipasang $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck . Saat runtime, init tahap pertama dijalankan /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 meliputi:

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

Ramdisk vendor_boot berisi bit vendor dari modul ramdisk dan kernel vendor, termasuk yang berikut ini:

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

Citra recovery harus mandiri. Itu harus berisi semua sumber daya yang diperlukan untuk mem-boot 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 sumber daya pemulihan lainnya, termasuk biner recovery , dll.
  • dll.

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

Menetapkan nilai PAPAN

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 di /system/bin/init . Saat perangkat melakukan booting ke mode pemulihan, biner /system/bin/init diperlukan untuk mendukung init tahap pertama dan tahap kedua.

Saat perangkat melakukan booting ke recovery , isi ramdisk recovery adalah sebagai berikut:

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

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

  • /init (dari ramdisk, dibuat dari init_first_stage )

Memindahkan file fstab

Pindahkan semua file fstab yang diinstal ke ramdisk generik ke vendor_ramdisk dan ramdisk recovery . Misalnya, lihat perubahan ini .

Memasang modul

Jika diinginkan, 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 root. Varian modul vendor_ramdisk dipasang ke akar vendor_ramdisk . Varian recovery modul dipasang ke akar ramdisk recovery . Misalnya pada pemasangan modul ke vendor_ramdisk dan recovery ramdisk, se Konsol tahap pertama dan checksum Metadata .

Konsol tahap pertama

Untuk menginstal varian modul vendor_ramdisk , gunakan yang berikut ini:

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 .

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

PRODUCT_PACKAGES += adbd.vendor_ramdisk

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

Untuk menginstal varian recovery modul, ganti vendor_ramdisk dengan recovery :

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

Checksum metadata

Untuk mendukung checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan pada 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 modul ini dan instal juga.

Perubahan pada proses booting

Saat booting ke Android, proses bootingnya tidak berubah. vendor_boot + ramdisk generik mirip dengan proses boot yang ada, kecuali fstab dimuat dari vendor_boot . Karena system/bin/recovery tidak ada, first_stage_init menanganinya sebagai boot normal.

Saat boot ke recovery mode, proses booting tidak berubah. Ramdisk pemulihan dimuat dengan cara yang sama seperti proses pemulihan yang ada. Kernel dimuat dari image recovery . Proses boot untuk mode pemulihan adalah sebagai berikut.

  1. Bootloader dimulai, lalu lakukan hal berikut:

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

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

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

Stempel waktu gambar boot

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 pembuatan, file system/etc/ramdisk/build.prop ditambahkan ke ramdisk generik. File ini berisi informasi stempel waktu build.

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