Genel başlatma bölümü

Android 12'de Genel Çekirdek Görüntüsü (GKI) olarak adlandırılan genel boot görüntüsü, genel ramdisk'i ve GKI çekirdeğini içerir.

Android 13 ile başlatılan cihazlarda, genel RAM diski boot resminden kaldırılarak ayrı bir init_boot resmine yerleştirilir. Bu değişiklik, boot görüntüsünde yalnızca GKI çekirdeğini bırakır.

Android 12 veya daha eski çekirdek sürümlerini kullanmaya devam eden cihazların yükseltilmesi için yeni bir init_boot resmi gerekmeden genel ramdisk olduğu yerde kalır.

Genel bir ramdisk oluşturmak için tedarikçiye özgü kaynakları, genel ramdisk yalnızca ilk aşamayı init ve zaman damgası bilgileri içeren bir özellik dosyası içerecek şekilde ramdisk'in dışına taşıyın.

Aşağıdaki durumlardaki cihazlarda:

  • Özel bir recovery bölümü kullanmayın. Tüm kurtarma bitleri genel ramdiskten vendor_boot ramdisk'e taşınır.

  • Özel bir recovery bölümü kullanın. recovery ramdisk kendi kendine yeterli olduğundan recovery ramdisk'te değişiklik yapılması gerekmez.

Mimari

Aşağıdaki şemalar, Android 12 ve sonraki sürümleri çalıştıran cihazların mimarisini göstermektedir. Android 13 ile kullanıma sunulan cihazlarda, genel ramdisk'i içeren yeni bir init_boot resmi bulunur. Android 12'den Android 13'e yükseltilen cihazlar, Android 12'de kullandıkları mimariyi kullanır.

Android 13 ile başlatma, özel kurtarma yok

Cihazı başlatma/yükseltme, GKI, özel kurtarma yok

Şekil 1. GKI ile kullanıma sunulan veya Android 13'e yükseltilen cihazlar (özel bir kurtarma işlemi yoktur).

Android 13, özel ve A/B kurtarma (özel ramdisk) ile başlatma

Cihazı başlatma/yükseltme, GKI, özel ve A/B kurtarma

Şekil 2. GKI, özel ve A/B kurtarma özelliğine sahip, Android 13'ü kullanıma sunan veya Android 13'e yükselten cihazlar.

Cihazda recovery_a ve recovery_b bölümleri varsa bu resme bakın.

Android 13 ile özel ve A/B olmayan kurtarma (özel ramdisk)

Cihazı başlatma/yükseltme, GKI, özel ve A/B olmayan kurtarma

Şekil 3. GKI, özel ve A/B olmayan kurtarma özelliğine sahip, Android 13'ü kullanıma sunan veya Android 13'e yükselten cihazlar.

Cihazınızda yuva son eki olmayan recovery adlı bir bölüm varsa bu resme bakın.

Android 12'yi başlatma veya Android 12'ye yükseltme, özel kurtarma yok

Cihazı başlatma/yükseltme, GKI, özel kurtarma yok

Şekil 4. Android 12'yi çalıştıran veya Android 12'ye yükselten cihazlar (GKI ile), özel kurtarma yok.

Android 12'yi başlatma veya Android 12'ye yükseltme, özel ve A/B kurtarma (özel ramdisk)

Cihazı başlatma/yükseltme, GKI, özel ve A/B kurtarma

Şekil 5. GKI, özel ve A/B kurtarma özelliğine sahip, Android 12'yi kullanıma sunan veya Android 12'ye yükselten cihazlar.

Cihazınızda recovery_a ve recovery_b bölümleri varsa bu resme bakın.

Android 12'yi başlatma veya yükseltme (özel ve A/B olmayan kurtarma işlemi) (özel ramdisk)

Cihazı başlatma/yükseltme, GKI, özel ve A/B olmayan kurtarma

Şekil 6. GKI, özel ve A/B olmayan kurtarma özelliğine sahip, Android 12'yi çalıştıran veya Android 12'ye yükselten cihazlar.

Cihazınızda slot son eki olmayan recovery adlı bir bölüm varsa bu resme bakın.

Android 12'ye yükseltme, önyükleme olarak kurtarma (ramdisk olarak kurtarma)

Cihazı başlatma/yükseltme, GKI yok, önyükleme olarak kurtarma

Şekil 7. Android 12'ye yükseltilen cihazlar, GKI yok, önyükleme olarak kurtarma.

Android 12'ye yükseltme, özel kurtarma (özel ramdisk)

Cihazı başlatma/yükseltme, GKI yok, özel kurtarma

Şekil 8. Android 12'ye yükseltilen cihazlar, GKI yok, özel kurtarma.

Önyükleme resmi içerikleri

Android önyükleme resimleri şunları içerir:

  • Android 13 ile kullanıma sunulan cihazlar için init_boot resmi eklendi

    • Başlık sürümü V4
    • Genel ramdisk görüntüsü
  • Genel boot resmi

    • Başlık sürümü V3 veya V4
      • GKI boot.img sertifikası için boot_signature (yalnızca v4). Sertifikalı GKI boot.img, doğrulanmış başlatma için imzalanmamış. OEM'ler, önceden derlenmiş boot.img dosyasını cihaza özel bir AVB anahtarıyla imzalamaya devam etmelidir.
      • Genel cmdline (GENERIC_KERNEL_CMDLINE)
      • GKI çekirdeği
    • Genel ramdisk görüntüsü
      • Yalnızca Android 12 ve önceki sürümlerdeki boot resimlerine dahil edilir
  • vendor_boot resmi (ayrıntılar için Tedarikçi Firma Önyükleme Bölümleri bölümüne bakın)

    • vendor_boot header
      • Cihaza özgü cmdline (BOARD_KERNEL_CMDLINE)
    • vendor_boot ramdisk resmi
      • lib/modules
      • Kurtarma kaynakları (özel kurtarma yoksa)
    • dtb resmi
  • recovery resmi

    • Başlık sürümü V2
      • Gerekirse kurtarma için cihaza özgü cmdline
      • A/B olmayan kurtarma bölümü için başlığın içeriği bağımsız olmalıdır; Kurtarma Görüntüleri'ne bakın. Örnek:
      • cmdline, boot ve vendor_boot cmdline ile birleştirilmiyor.
      • Başlık, gerekirse kurtarma DTBO'sunu belirtir.
      • A/B kurtarma bölümü için içerikler boot ve vendor_boot'ten birleştirilebilir veya çıkarılabilir. Örnek:
      • cmdline, boot ve vendor_boot cmdline ile birleştirilir.
      • DTBO, vendor_boot başlığından anlaşılabilir.
    • recovery ramdisk resmi
      • Kurtarma kaynakları
      • A/B olmayan kurtarma bölümü için RAM diskinin içeriği bağımsız olmalıdır. Kurtarma Görüntüleri konusuna bakın. Örnek:
      • lib/modules, kurtarma modunda önyükleme yapmak için gereken tüm çekirdek modüllerini içermelidir.
      • Kurtarma ramdisk'i init içermelidir.
      • A/B kurtarma bölümü için kurtarma ramdisk'i, genel ve vendor_boot ramdisk'ine eklenir. Bu nedenle, bağımsız olması gerekmez. Örnek:
      • lib/modules, vendor_boot RAM diskindeki çekirdek modüllerinin yanı sıra, yalnızca kurtarma modunu başlatmak için gereken ek çekirdek modüllerini içerebilir.
      • /init adresindeki sembolik bağlantı mevcut olabilir ancak önyükleme görüntüsünde ilk aşama /init ikili dosyası tarafından gölgelenir.

Genel ramdisk görüntü içeriği

Genel ramdisk aşağıdaki bileşenleri içerir.

  • init
  • system/etc/ramdisk/build.prop
  • ro.PRODUCT.bootimg.* build eşyalar
  • Bağlantı noktaları için boş dizinler: debug_ramdisk/, mnt/, dev/, sys/, proc/, metadata/
  • first_stage_ramdisk/
    • Bağlantı noktaları için yinelenen boş dizinler: debug_ramdisk/, mnt/, dev/, sys/, proc/, metadata/

Önyükleme görüntüsü entegrasyonu

Derleme işaretleri, init_boot, boot, recovery ve vendor_boot resimlerinin nasıl oluşturulacağını kontrol eder. Boole mantıksal panosunun değeri true dizesi veya boş olmalıdır (varsayılan değer).

  • TARGET_NO_KERNEL. Bu değişken, derlemenin önceden oluşturulmuş bir başlatma görüntüsü kullanıp kullanmadığını gösterir. Bu değişken true olarak ayarlanmışsa BOARD_PREBUILT_BOOTIMAGE'ü önceden oluşturulmuş önyükleme resminin konumuna (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img) ayarlayın.

  • BOARD_USES_RECOVERY_AS_BOOT. Bu değişken, cihazın boot resmi olarak recovery resmini kullanıp kullanmadığını belirtir. GKI kullanılırken bu değişken boştur ve kurtarma kaynakları vendor_boot alanına taşınmalıdır.

  • BOARD_USES_GENERIC_KERNEL_IMAGE. Bu değişken, kartın GKI kullandığını gösterir. Bu değişken, sysprops veya PRODUCT_PACKAGES öğesini etkilemez.

    Bu, kart düzeyinde GKI anahtarıdır; aşağıdaki değişkenlerin tümü bu değişken tarafından kısıtlanır.

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. Bu değişken, ramdisk kurtarma kaynaklarının vendor_boot için oluşturulup oluşturulmayacağını kontrol eder.

    • true olarak ayarlandığında kurtarma kaynakları yalnızca vendor-ramdisk/ için oluşturulur, recovery/root/ için oluşturulmaz.

    • Boş olduğunda, kurtarma kaynakları yalnızca recovery/root/ için oluşturulur ve vendor-ramdisk/ için oluşturulmaz.

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. Bu değişken, GSI AVB anahtarlarının vendor_boot için oluşturulup oluşturulmayacağını kontrol eder.

    • true olarak ayarlandığında, BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:

      • Ayarlanırsa GSI AVB anahtarları $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb olacak şekilde oluşturulur.

      • Ayarlanmazsa GSI AVB anahtarları $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb sistemine yerleşiktir.

    • Boş olduğunda BOARD_RECOVERY_AS_ROOT:

      • Ayarlandıysa GSI AVB anahtarları $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb ürününe tasarlanmıştır.

      • Ayarlanmamışsa GSI AVB anahtarları $ANDROID_PRODUCT_OUT/ramdisk/avb olacak şekilde oluşturulur.

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. Bu değişken, recovery görüntüsünün çekirdek içerip içermediğini kontrol eder. Android 12 ile kullanıma sunulan ve A/B recovery bölümünü kullanan cihazlar bu değişkeni true olarak ayarlamalıdır. Android 12 ile kullanıma sunulan ve A/B olmayan bir sistem kullanan cihazların, kurtarma görüntüsünün kendi kendine yeterli kalması için bu değişkeni false olarak ayarlamalıdır.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. Bu değişken, $OUT/boot*.img'un hedef dosyalar altında IMAGES/'ye kopyalanıp kopyalanmayacağını kontrol eder.

    • aosp_arm64, bu değişkeni true olarak ayarlamalıdır.

    • Diğer cihazlar bu değişkeni boş bırakmalıdır.

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. Bu değişken, init_boot.img öğesinin oluşturulup oluşturulmayacağını kontrol eder ve boyutunu ayarlar. Ayarlandığında, genel ramdisk boot.img yerine init_boot.img öğesine eklenir ve BOARD_AVB_INIT_BOOT* değişkenlerinin zincir vbmeta için ayarlanmasını gerektirir.

İzin verilen kombinasyonlar

Bileşen veya değişken Cihaz yükseltme işlemini kurtarma bölümü olmadan yapma Kurtarma bölümüyle cihazı yeni sürüme geçir Cihazı kurtarma bölümü olmadan başlatma A/B kurtarma bölümüne sahip cihazı başlatma A/B olmayan bir kurtarma bölümüne sahip cihazı başlatma aosp_arm64
boot içerir evet evet evet evet evet evet
init_boot (Android 13) içerir no no evet evet evet evet
vendor_boot içerir isteğe bağlı isteğe bağlı evet evet evet no
recovery içerir no evet no evet evet no
BOARD_USES_RECOVERY_AS_BOOT true boş boş boş boş boş
BOARD_USES_GENERIC_KERNEL_IMAGE boş boş true true true true
PRODUCT_BUILD_RECOVERY_IMAGE boş true veya boş boş true veya boş true veya boş boş
BOARD_RECOVERYIMAGE_PARTITION_SIZE boş > 0 boş > 0 > 0 boş
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT boş boş true boş boş boş
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT boş boş true true true boş
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE boş boş boş true boş boş
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES boş boş boş boş boş true

Özel recovery bölümü olan cihazlarda PRODUCT_BUILD_RECOVERY_IMAGE, true olarak ayarlanabilir veya boş bırakılabilir. Bu cihazlarda BOARD_RECOVERYIMAGE_PARTITION_SIZE ayarlanırsa recovery resmi oluşturulur.

Başlatma için zincirlenmiş vbmeta'yı etkinleştirme

Zincirlenmiş vbmeta, boot ve init_boot resimleri için etkinleştirilmelidir. Aşağıdakileri belirtin:

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

Örneğin, bu değişikliği inceleyin.

Sistem-root

GKI kullanan cihazlarda kök olarak sistem desteklenmez. Bu tür cihazlarda BOARD_BUILD_SYSTEM_ROOT_IMAGE boş olmalıdır. Kök olarak sistem özelliği, dinamik bölümler kullanan cihazlar için de desteklenmez.

Ürün yapılandırmaları

Genel ramdisk kullanan cihazlar, ramdisk'e yüklenmesine izin verilen dosyaların listesini yüklemelidir. Bunun için device.mk içinde aşağıdakileri belirtin:

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

generic_ramdisk.mk dosyası, diğer makefile'lerin yanlışlıkla ramdisk'e başka dosya yüklemesini de engeller (bu tür dosyaları vendor_ramdisk'e taşıyın).

Cihazları ayarla

Kurulum talimatları, Android 13 ile kullanıma sunulan, Android 12'ye yükseltilen ve Android 12 ile kullanıma sunulan cihazlar arasında farklılık gösterir. Android 13, Android 12'dekine benzer şekilde ayarlanır.

  • Android 12'ye yükseltilen cihazlar:

    • BOARD_USES_RECOVERY_AS_BOOT değerini koruyabilir. Bu durumda eski yapılandırmaları kullanıyorlar demektir ve yeni derleme değişkenleri boş olmalıdır. Bu tür cihazlar:

      • BOARD_USES_RECOVERY_AS_BOOT değerini true olarak ayarlayın. Mimari, Şekil 3'te gösterildiği gibidir.

      • BOARD_USES_RECOVERY_AS_BOOT değerini boş olarak ayarlayın. Mimari, Şekil 4'te gösterildiği gibidir.

    • BOARD_USES_RECOVERY_AS_BOOT alanı boş olarak ayarlanabilir. Bu durumda, yeni yapılandırmalar kullanıyorlardır. Bu tür cihazlar:

  • Android 12 ile kullanıma sunulan cihazlar, BOARD_USES_RECOVERY_AS_BOOT değerini boş olarak ayarlamalı ve yeni yapılandırmaları kullanmalıdır. Bu tür cihazlar:

aosp_arm64 yalnızca GKI oluşturduğundan (vendor_boot veya kurtarma işlemini değil), tam bir hedef değildir. aosp_arm64Derleme yapılandırmaları için generic_arm64 bölümüne bakın.

1. Seçenek: Özel bir kurtarma bölümü yok

recovery bölümü olmayan cihazlar, boot bölümünde genel boot resmini içerir. vendor_boot ramdisk'i, lib/modules (tedarikçi çekirdek modülleri ile) dahil tüm kurtarma kaynaklarını içerir. Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk kaynağından devralır.

BOARD değerlerini ayarlama

Aşağıdaki değerleri ayarlayın:

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

vendor_boot RAM diski, /init ile /system/bin/init arasında bir sembolik bağlantı ve /system/bin/init konumunda init_second_stage.recovery içerebilir. Ancak genel ramdisk, vendor_boot ramdisk'ten sonra birleştirildiği için /init sembolik bağlantısının üzerine yazılır. Cihaz kurtarma moduna açıldığında ikinci aşamalı başlatmayı desteklemek için /system/bin/init ikili dosyası gerekir. vendor_boot + genel RAM'lerin içeriği aşağıdaki gibidir:

  • /init (genel ramdisk'ten, init_first_stage sitesinden oluşturuldu)
  • /system/bin/init (vendor_ramdisk başlangıç fiyatıyla, init_second_stage.recovery projesinden geliştirildi)

fstab dosyalarını taşıma

Genel RAM'e yüklenen fstab dosyalarını vendor_ramdisk konumuna taşıyın. Örneğin, bu değişikliğe bakın.

Modül yükleme

Cihazlara özel modülleri vendor_ramdisk'e yükleyebilirsiniz (Yüklemeniz gereken cihaza özel modül yoksa bu adımı atlayın).

  • Modül /first_stage_ramdisk ürününe yüklenirken modülün vendor_ramdisk varyantını kullanın. Bu modül, init kökü /first_stage_ramdisk olarak değiştirdikten sonra ancak init kökü /system olarak değiştirdikten önce kullanılabilir. Örnekler için Meta veri sağlamaları ve Sanal A/B sıkıştırması bölümlerine bakın.

  • Modül /'a yüklendiğinde modülün recovery varyantını kullanın. Bu modül, init kökü /first_stage_ramdisk olarak değiştirmeden önce kullanılabilir olmalıdır. /'e modül yükleme hakkında ayrıntılı bilgi için Birinci aşama konsolu başlıklı makaleyi inceleyin.

İlk aşama konsolu

İlk aşama konsolu, init kök dizinini /first_stage_ramdisk olarak değiştirmeden önce başladığından modüllerin recovery varyantını yüklemeniz gerekir. Varsayılan olarak her iki modül varyantı da build/make/target/product/base_vendor.mk'e yüklenir. Bu nedenle, cihaz makefile'i bu dosyadan devralınırsa recovery varyantını açıkça yüklemeniz gerekmez.

Kurtarma modüllerini açıkça yüklemek için aşağıdakileri kullanın.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

Bu işlem, linker, sh ve toybox öğelerinin $ANDROID_PRODUCT_OUT/recovery/root/system/bin ürününe yüklenmesini, ardından da vendor_ramdisk altında /system/bin uygulamasına yüklenmesini sağlar.

İlk aşama konsolu (ör. adbd) için gerekli modülleri eklemek isterseniz aşağıdakileri kullanın.

PRODUCT_PACKAGES += adbd.recovery

Bu şekilde, belirtilen modüllerin $ANDROID_PRODUCT_OUT/recovery/root/system/bin'e yüklenmesi sağlanır. $ANDROID_PRODUCT_OUT/recovery/root/system/bin, daha sonra vendor_ramdisk altında /system/bin'e yüklenir.

Meta veri sağlama toplamları

İlk aşamada bağlama sırasında meta veri sağlama toplamalarını desteklemek için GKI'yi desteklemeyen cihazlar aşağıdaki modüllerin ramdisk varyantını yükler. GKI için destek eklemek üzere modülleri $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin adresine taşıyın:

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

Örnek olarak bu değişiklik listesine göz atın.

Sanal A/B sıkıştırma

Sanal A/B sıkıştırmasının desteklenmesi için snapuserd, vendor_ramdisk konumuna yüklenmelidir. Cihaz, snapuserd'in vendor_ramdisk varyantını yükleyen virtual_ab_ota/compression.mk kaynağından devralmalıdır.

Önyükleme sürecindeki değişiklikler

Kurtarma veya Android'i başlatma işlemi aşağıdaki istisna dışında değişmez:

  • Ramdisk build.prop, ikinci aşama init'nin önyüklemenin derleme zaman damgasını okuyabilmesi için /second_stage_resources'e taşınır.

Kaynaklar genel ramdisk'ten vendor_boot ramdisk'e taşındığından, genel ramdisk'in vendor_boot ramdisk'te birleştirilmesinin sonucu değişmez.

e2fsck'yi kullanılabilir hale getirme

Cihaz makefile'leri aşağıdakilerden devralabilir:

  • Cihaz sanal A/B'yi destekleyip sıkıştırmayı desteklemiyorsa virtual_ab_ota/launch_with_vendor_ramdisk.mk.

  • Cihaz sanal A/B sıkıştırmayı destekliyorsa virtual_ab_ota/compression.mk.

Ürün oluşturma dosyaları $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck yüklenir. Çalışma zamanında, ilk aşama init kökü /first_stage_ramdisk olarak değiştirir ve ardından /system/bin/e2fsck'yi yürütür.

2a seçeneği: Özel ve A/B kurtarma bölümü

Bu seçeneği, A/B recovery bölümlerine sahip cihazlarda (yani cihazda recovery_a ve recovery_b partition varsa) kullanın. Bu tür cihazlar arasında, aşağıdaki yapılandırmayla kurtarma bölümünün güncellenebildiği A/B ve sanal A/B cihazlar yer alır:

AB_OTA_PARTITIONS += recovery

vendor_boot RAM'i, aşağıdakiler de dahil olmak üzere ramdisk ve tedarikçi çekirdeği modüllerinin tedarikçi bitlerini içerir:

  • Cihaza özgü fstab dosyaları

  • lib/modules (tedarikçi çekirdek modüllerini içerir)

recovery RAM'i tüm kurtarma kaynaklarını içerir. Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk'den devralınır.

BOARD değerlerini ayarlama

A/B recovery bölümüne sahip cihazlar için aşağıdaki değerleri ayarlayın:

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

recovery ramdisk'i bir /init -> /system/bin/init sembolik bağlantısı ve /system/bin/init adresinde init_second_stage.recovery içerebilir. Bununla birlikte, başlatma RAM'i recovery ram diskinden sonra birleştirildiği için /init sembolik bağlantısının üzerine yazılır. Cihaz, kurtarma modunda başlatıldığında, ikinci aşamayı başlatma özelliğini desteklemek için /system/bin/init ikilisi gerekir.

Cihaz recovery'te başlatılırken recovery + vendor_boot + genel ramdisk'lerin içeriği aşağıdaki gibidir:

  • /init (ramdisk'ten, init_first_stage'ten derlenmiştir)
  • /system/bin/init (recovery ramdisk'inden, init_second_stage.recovery'den derlenmiş ve /init'ten yürütülmüştür)

Cihaz Android'e başlatıldığında vendor_boot ve genel RAM'lerin içeriği aşağıdaki gibi olur:

  • /init (genel ramdisk'ten, init_first_stage sitesinden oluşturuldu)

fstab dosyalarını taşıma

Genel ramdisk'e yüklenen fstab dosyalarını vendor_ramdisk'e taşıyın. Örneğin, bu değişikliği inceleyin.

Modülleri yükleme

İsteğe bağlı olarak, vendor_ramdisk'e cihaza özgü modüller yükleyebilirsiniz (Yüklemeniz gereken cihaza özgü modül yoksa bu adımı atlayın). Init kök kullanıcıya geçmez. Modüllerin vendor_ramdisk varyantı, vendor_ramdisk'ün köküne yüklenir. vendor_ramdisk'e modül yüklemeyle ilgili örnekler için Birinci aşama konsolu, Meta veri sağlama toplama ve Sanal A/B sıkıştırma başlıklı makalelere bakın.

İlk aşama konsolu

Modüllerin vendor_ramdisk varyantını yüklemek için aşağıdakileri kullanın:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Bu sayede linker, sh ve toybox, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'e yüklenir. $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin daha sonra vendor_ramdisk altındaki /system/bin'e yüklenir.

İlk aşama konsolu için gereken modülleri (ör. adbd) eklemek üzere, ilgili yamaları AOSP'ye yükleyerek bu modüllerin vendor_ramdisk varyantını etkinleştirin ve ardından aşağıdakileri kullanın:

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Bu sayede, belirtilen modüller $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'e yüklenir. vendor_boot ramdisk'i kurtarma modunda yüklenirse modül recovery'te de kullanılabilir. vendor_boot ramdisk'i kurtarma modunda yüklenmezse cihaz isteğe bağlı olarak adbd.recovery'ı da yükleyebilir.

Meta veri sağlama toplamları

İlk aşamada bağlama sırasında meta veri sağlama toplamalarını desteklemek için GKI'yi desteklemeyen cihazlar aşağıdaki modüllerin ramdisk varyantını yükler. GKI desteği eklemek için modülleri $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'ye taşıyın:

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

Örnek olarak bu değişiklik listesine göz atın.

Sanal A/B sıkıştırma

Sanal A/B sıkıştırmayı desteklemek için snapuserd, vendor_ramdisk'e yüklenmelidir. Cihaz, snapuserd'in vendor_ramdisk varyantını yükleyen virtual_ab_ota/compression.mk kaynağından devralmalıdır.

Önyükleme sürecindeki değişiklikler

Android cihaz başlatılırken başlatma işlemi değişmez. vendor_boot + genel ramdisk, fstab'un vendor_boot'ten yüklenmesi dışında mevcut önyükleme işlemine benzer. system/bin/recovery olmadığından first_stage_init bunu normal bir önyükleme olarak işler.

Kurtarma modundayken başlatma işlemi değişir. Kurtarma + vendor_boot + genel ramdisk, mevcut kurtarma işlemine benzer ancak çekirdek, recovery resmi yerine boot resminden yüklenir. Kurtarma modu için önyükleme işlemi aşağıdaki gibidir.

  1. Önyükleme yükleyici başlar ve aşağıdakileri yapar:

    1. Kurtarma + vendor_boot + genel ramdisk'i /'a gönderir. (OEM, BOARD_RECOVERY_KERNEL_MODULES'e ekleyerek çekirdek modüllerini kurtarma ramdisk'inde kopyalarsa vendor_boot isteğe bağlıdır.)
    2. boot bölümünden çekirdeği çalıştırır.
  2. Çekirdek, ramdisk'i /'e bağlar ve ardından genel ramdisk'ten /init'ı yürütür.

  3. İlk aşamada init başlar ve aşağıdakileri yapar:

    1. IsRecoveryMode() == true ve ForceNormalBoot() == false ayarlarını yapar.
    2. /lib/modules'ten tedarikçi firma çekirdek modüllerini yükler.
    3. DoFirstStageMount() çağrısı yapar ancak IsRecoveryMode() == true nedeniyle bağlamayı atlar. (Cihaz ramdisk'i yer açmaz (/ hâlâ aynı olduğu için) ancak SetInitAvbVersionInRecovery() çağırır.)
    4. İkinci aşama başlatma işlemini /system/bin/init konumundan recovery RAM'den başlatır.

e2fsck'yi kullanılabilir hale getirme

Cihaz makefile'leri aşağıdakilerden devralabilir:

  • Cihaz sanal A/B'yi destekleyip sıkıştırmayı desteklemiyorsa virtual_ab_ota/launch_with_vendor_ramdisk.mk.

  • Cihaz sanal A/B sıkıştırmayı destekliyorsa virtual_ab_ota/compression.mk.

Ürün oluşturma dosyaları $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck yüklenir. Çalışma zamanında, ilk aşama init, /system/bin/e2fsck'ı yürütür.

2b seçeneği: Özel ve A/B olmayan kurtarma bölümü

A/B olmayan bir recovery bölümü olan cihazlar için bu seçeneği kullanın. Yani cihazda, yuva son eki olmayan recovery adlı bir bölüm olmalıdır. Bu tür cihazlar şunlardır:

  • A/B olmayan cihazlar;
  • Kurtarma bölümü güncellenemez olan A/B ve Sanal A/B cihazları. (Bu olağan dışı bir durumdur.)

vendor_boot ramdisk'i, ramdisk'in tedarikçi bitlerini ve aşağıdakiler dahil olmak üzere tedarikçi çekirdek modüllerini içerir:

  • Cihaza özgü fstab dosyaları
  • lib/modules (tedarikçi çekirdek modülleri dahil)

recovery resmi bağımsız olmalıdır. Aşağıdakiler dahil olmak üzere kurtarma modunu başlatmak için gereken tüm kaynakları içermelidir:

  • Çekirdek resmi
  • DTBO resmi
  • lib/modules çekirdek modülleri
  • Simge bağlantısı olarak ilk aşamada başlatma /init -> /system/bin/init
  • İkinci aşama init ikili dosyası /system/bin/init
  • Cihaza özgü fstab dosyaları
  • recovery ikili dosyası dahil diğer tüm kurtarma kaynakları

Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk'den devralınır.

BOARD (BOARD) değerlerini ayarlayın

A/B olmayan cihazlar için aşağıdaki değerleri ayarlayın:

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

recovery ramdisk'inde bir /init -> /system/bin/init sembolik bağlantısı ve /system/bin/init adresinde init_second_stage.recovery bulunmalıdır. Cihaz kurtarma modunda açıldığında hem birinci aşama hem de ikinci aşama init'i desteklemek için /system/bin/init ikili dosyası gerekir.

Cihaz recovery'te önyüklendiğinde recovery ramdisk'lerinin içeriği aşağıdaki gibidir:

  • /init -> /system/bin/init (recovery ramdisk'inden)
  • /system/bin/init (recovery ramdiskten, init_second_stage.recovery kaynağından oluşturuldu ve /init kaynağından yürütüldü)

Cihaz Android'de önyüklendiğinde vendor_boot + genel ramdisk'lerin içeriği aşağıdaki gibidir:

  • /init (ramdisk'ten, init_first_stage'ten derlenmiştir)

Fstab dosyalarını taşıma

Genel ramdisk'e yüklenen tüm fstab dosyalarını vendor_ramdisk ve recovery ramdisk'ine taşıyın. Örneğin, bu değişikliğe bakın.

Modülleri yükleme

vendor_ramdisk ve recovery ramdisk'e cihaza özel modüller yükleyebilirsiniz (yüklenecek cihaza özel modülleriniz yoksa bu adımı atlayın). init kök kullanıcıya geçmez. Modüllerin vendor_ramdisk varyantı, vendor_ramdisk'ün köküne yüklenir. Modüllerin recovery varyantı, recovery ramdisk'in köküne yüklenir. Modülleri vendor_ramdisk ve recovery ramdisk'ine yüklemeyle ilgili örnekler için Birinci aşama konsolu ve Meta veri sağlama toplamları bölümünü inceleyin.

İlk aşama konsolu

Modüllerin vendor_ramdisk varyantını yüklemek için aşağıdakileri kullanın:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Bu sayede linker, sh ve toybox, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'e yüklenir. $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin daha sonra vendor_ramdisk altındaki /system/bin'e yüklenir.

İlk aşama konsolu için gereken modülleri (ör. adbd) eklemek üzere, ilgili yamaları AOSP'ye yükleyerek bu modüllerin vendor_ramdisk varyantını etkinleştirin ve ardından aşağıdakileri kullanın:

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Bu sayede, belirtilen modüller $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'e yüklenir.

Modüllerin recovery varyantını yüklemek için vendor_ramdisk yerine recovery yazın:

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

Meta veri sağlama toplamları

GKI'yi desteklemeyen cihazlar, ilk aşamada bağlama sırasında meta veri sağlama toplamalarını desteklemek için aşağıdaki modüllerin ramdisk varyantını yükler. GKI desteği eklemek için modülleri $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'ye taşıyın:

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

Kurtarma sırasında ilk aşamada bağlama sırasında meta veri sağlama toplamalarını desteklemek için bu modüllerin kurtarma varyantını etkinleştirin ve yükleyin.

Önyükleme sürecindeki değişiklikler

Android'e önyükleme yaparken önyükleme işlemi değişmez. vendor_boot + genel ramdisk, fstab'un vendor_boot'ten yüklenmesi dışında mevcut önyükleme işlemine benzer. system/bin/recovery mevcut olmadığı için first_stage_init bunu normal başlatma olarak işler.

Kurtarma modundayken başlatma işlemi değişmez. Kurtarma ramdisk'i, mevcut kurtarma süreciyle aynı şekilde yüklenir. Çekirdek, recovery görüntüsünden yüklenir. Kurtarma modu için önyükleme işlemi aşağıdaki gibidir.

  1. Önyükleme yükleyici başlar ve aşağıdakileri yapar:

    1. Kurtarma RAM'ini / hedefine aktarır.
    2. Çekirdeği recovery bölümünden çalıştırır.
  2. Çekirdek, ramdisk'i /'e bağlar ve ardından recovery ramdisk'indeki /system/bin/init için sembolik bağlantı olan /init'ı yürütür.

  3. İlk aşama başlatma, ardından şunları yapar:

    1. IsRecoveryMode() == true ve ForceNormalBoot() == false ayarlarını yapar.
    2. /lib/modules'ten tedarikçi firma çekirdek modüllerini yükler.
    3. DoFirstStageMount() çağrısı yapar ancak IsRecoveryMode() == true nedeniyle bağlamayı atlar. (Cihaz ramdisk'i yer açmaz (/ hâlâ aynı olduğu için) ancak SetInitAvbVersionInRecovery() çağırır.)
    4. recovery ramdisk'inden /system/bin/init adresinden ikinci aşama init'i başlatır.

Önyükleme görüntüsü zaman damgaları

Aşağıdaki kod, örnek bir boot resim zaman damgası dosyasıdır:

####################################
# 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
  • Derleme sırasında, genel ramdisk'e bir system/etc/ramdisk/build.prop dosyası eklenir. Bu dosya, derlemenin zaman damgası bilgilerini içerir.

  • Çalışma zamanında, ilk aşama init, ramdisk'i boşaltmadan önce dosyaları ramdisk'ten tmpfs'a kopyalar. Böylece ikinci aşama init, boot resim zaman damgası özelliklerini ayarlamak için bu dosyayı okuyabilir.