Genel önyükleme bölümü

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

Android 13 ile kullanıma sunulan cihazlarda genel ramdisk, boot görüntüsünden kaldırılıp ayrı bir init_boot görüntüsüne yerleştirilir. Bu değişiklik, boot görüntüsünde yalnızca GKI çekirdeğinin kalmasına neden olur.

Android 12 veya daha eski çekirdek sürümlerini kullanmaya devam eden cihazlar yükseltilirken genel ramdisk olduğu yerde kalır ve yeni bir init_boot görüntüsü gerekmez.

Genel bir ramdisk oluşturmak için satıcıya özel kaynakları ramdisk'ten çıkarın. Böylece genel ramdisk yalnızca ilk aşama init ve zaman damgası bilgilerini içeren bir özellik dosyası içerir.

Aşağıdaki özelliklere sahip cihazlarda:

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

  • recovery bölümünü kullanın. recovery ramdisk bağımsız olduğundan recovery ramdisk'te değişiklik yapılması gerekmez.

Mimari

Aşağıdaki şemalarda, Android 12 ve sonraki sürümleri çalıştıran cihazların mimarisi gösterilmektedir. 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 kullanıma sunulur, özel kurtarma yoktur

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

Şekil 1. GKI ile Android 13'e yükseltilen veya Android 13'ü kullanıma sunan cihazlarda özel kurtarma bölümü yoktur.

Android 13 ile kullanıma sunulur, özel ve A/B kurtarma (özel ramdisk)

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

Şekil 2. GKI, özel ve A/B kurtarma özellikleriyle Android 13'e yükseltilen veya Android 13'ü kullanmaya başlayan cihazlar.

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

Android 13 ile kullanıma sunulur, özel ve A/B olmayan kurtarma (özel ramdisk)

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

Şekil 3. Android 13'e yükseltilen veya Android 13 ile kullanıma sunulan, GKI, özel ve A/B olmayan kurtarma bölümlerine sahip cihazlar.

Cihazda, yuva son eki olmadan recovery adlı bir bölüm varsa bu şekle bakın.

Android 12'ye geçiş veya yükseltme, özel kurtarma yok

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

Şekil 4. GKI ile Android 12'ye yükseltilen veya Android 12'nin yüklendiği cihazlarda özel kurtarma bölümü yoktur.

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 özellikleriyle Android 12'ye yükseltilen veya Android 12'nin yüklendiği cihazlar.

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

Android 12'ye geçiş veya yükseltme, özel ve A/B olmayan kurtarma (özel ramdisk)

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

Şekil 6. GKI, özel ve A/B olmayan kurtarma ile Android 12'ye yükseltilen veya Android 12'nin yüklendiği cihazlar.

Cihazda, yuva son eki olmadan recovery adlı bir bölüm varsa bu şekle bakın.

Android 12'ye yükseltme, recovery-as-boot (recovery-as-ramdisk)

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

Şekil 7. Android 12'ye yükseltilen, GKI'sız, önyükleme olarak kurtarma özelliği olan cihazlar.

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 görüntüsü içerikleri

Android önyükleme görüntüleri ş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 resim

    • 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 oluşturulmuş boot.img öğesini 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 görüntülerinde yer alır.
  • vendor_boot resmi (ayrıntılar için Vendor Boot Partitions bölümüne bakın)

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

    • Üstbilgi 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 bölümüne bakın. Örneğin:
      • cmdline, boot ve vendor_boot cmdline ile birleştirilmiyor.
      • Gerekirse başlık, kurtarma DTBO'sunu belirtir.
      • A/B kurtarma bölümü için içerikler birleştirilebilir veya boot ve vendor_boot'dan çıkarılabilir. Örneğin:
      • cmdline, boot ve vendor_boot cmdline ile birleştirilir.
      • DTBO, vendor_boot başlığından çıkarılabilir.
    • recovery ramdisk image
      • Kurtarma kaynakları
      • A/B olmayan kurtarma bölümü için ramdisk'in içeriği bağımsız olmalıdır. Kurtarma Görüntüleri bölümüne bakın. Örneğin:
      • lib/modules, kurtarma modunda başlatmak için gereken tüm çekirdek modüllerini içermelidir.
      • Kurtarma ramdiski init içermelidir.
      • A/B kurtarma bölümü için kurtarma ramdiski, genel ve vendor_boot ramdiskine eklenir. Bu nedenle bağımsız olması gerekmez. Örneğin:
      • lib/modules, vendor_boot ramdisk'teki çekirdek modüllerinin yanı sıra kurtarma modunun başlatılması için gereken ek çekirdek modüllerini içerebilir.
      • /init konumundaki sembolik bağlantı mevcut olabilir ancak başlatma görüntüsündeki ilk aşama /init ikili programı tarafından gölgede bırakılır.

Genel ramdisk görüntü içerikleri

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

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

Başlatma görüntüsü entegrasyonu

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

  • TARGET_NO_KERNEL. Bu değişken, derlemede önceden oluşturulmuş bir önyükleme görüntüsünün kullanılıp kullanılmadığını gösterir. Bu değişken true olarak ayarlanırsa BOARD_PREBUILT_BOOTIMAGE değişkenini önceden oluşturulmuş başlatma görüntüsünün konumuna (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img) ayarlayın.

  • BOARD_USES_RECOVERY_AS_BOOT. Bu değişken, cihazın recovery resmini boot resmi olarak kullanıp kullanmadığını gösterir. GKI kullanılırken bu değişken boş olur ve kurtarma kaynakları vendor_boot konumuna 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'ı etkilemez.

    Bu, kart düzeyinde GKI anahtarıdır. Aşağıdaki tüm değişkenler bu değişkenle sınırlanır.

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

    • true olarak ayarlandığında kurtarma kaynakları yalnızca vendor-ramdisk/ için oluşturulur ve 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 ise:

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

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

    • Boş olduğunda, BOARD_RECOVERY_AS_ROOT ise:

      • Ayarlanır. GSI AVB anahtarları, $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb olacak şekilde oluşturulur.

      • 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 resminin ç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 cihazlar, kurtarma görüntüsünün bağımsız kalması için bu değişkeni false olarak ayarlamalıdır.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. Bu değişken, hedef dosyalarda $OUT/boot*.img öğesinin IMAGES/ altına 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 boyutu ayarlar. Ayarlandığında, genel ramdisk boot.img yerine init_boot.img'ya eklenir ve zincirleme vbmeta için BOARD_AVB_INIT_BOOT* değişkenlerinin ayarlanmasını gerektirir.

İzin verilen kombinasyonlar

Bileşen veya değişken Kurtarma bölümü olmadan cihazı yükseltme Kurtarma bölümüyle cihazı yükseltme Kurtarma bölümü olmadan cihazı başlatma A/B kurtarma bölümüyle cihazı başlatma A/B olmayan kurtarma bölümüyle cihazı başlatma aosp_arm64
boot içerir evet evet evet evet evet evet
init_boot (Android 13) içerir hayır hayır evet evet evet evet
vendor_boot içerir isteğe bağlı isteğe bağlı evet evet evet hayır
recovery içerir hayır evet hayır evet evet hayır
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 cihazlar PRODUCT_BUILD_RECOVERY_IMAGE değerini true veya boş olarak ayarlayabilir. Bu cihazlarda, BOARD_RECOVERYIMAGE_PARTITION_SIZE ayarlanmışsa recovery resmi oluşturulur.

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

Zincirleme 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

Örnek için bu değişikliğe bakın.

System-as-root

GKI kullanan cihazlarda System-as-root desteklenmez. Bu tür cihazlarda BOARD_BUILD_SYSTEM_ROOT_IMAGE boş olmalıdır. System-as-root, dinamik bölümleri kullanan cihazlarda da 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 bölümünde aşağıdakileri belirtin:

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

generic_ramdisk.mk dosyası, diğer makefile'ların ramdisk'e yanlışlıkla başka dosyalar 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 cihazlara göre farklılık gösterir. Android 13'te Android 12'deki gibi ayarlanır.

  • Android 12'ye yükseltilen cihazlar:

    • BOARD_USES_RECOVERY_AS_BOOT değerini koruyabilir. Bu durumda eski yapılandırmalar kullanılıyor 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 boş olarak ayarlandığında mimari, Şekil 4'te gösterildiği gibidir.

    • BOARD_USES_RECOVERY_AS_BOOT boş olarak ayarlanabilir. Bu durumda yeni yapılandırmalar kullanılıyor demektir. Bu tür cihazlar:

      • Özel bir recovery bölümü kullanmayın. Mimari, Şekil 1'de gösterildiği gibidir ve cihaz kurulumu seçeneği Seçenek 1'dir.

      • Özel bir recovery bölümü kullanın. Mimari, Şekil 2a veya Şekil 2b'de gösterildiği gibidir ve cihaz kurulumu seçeneği Seçenek 2a veya Seçenek 2b'dir.

  • 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:

    • Özel bir recovery bölümü kullanmayın. Mimari, Şekil 1'de gösterildiği gibidir ve cihaz kurulumu seçeneği Seçenek 1'dir.

    • Özel bir recovery bölümü kullanın. Mimari, Şekil 2a veya Şekil 2b'de gösterildiği gibidir ve cihaz kurulumu seçeneği Seçenek 2a veya Seçenek 2b'dir.

aosp_arm64 yalnızca GKI (vendor_boot veya kurtarma değil) oluşturduğundan tam bir hedef değildir. aosp_arm64 derleme yapılandırmaları için generic_arm64 başlıklı makaleyi inceleyin.

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

recovery bölümü olmayan cihazlarda, boot bölümünde genel boot görüntüsü bulunur. vendor_boot ramdisk'inde lib/modules (satıcı çekirdek modülleriyle birlikte) dahil olmak üzere tüm kurtarma kaynakları bulunur. Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk'dan devralını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 ramdisk, /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ı üzerine yazılır. Cihaz kurtarma modunda başlatıldığında ikinci aşama başlatma işlemini desteklemek için /system/bin/init ikili dosyası gerekir. vendor_boot + genel ramdisklerin içerikleri şunlardır:

  • /init (init_first_stage kullanılarak oluşturulan genel ramdisk'ten)
  • /system/bin/init (vendor_ramdisk tarafından, init_second_stage.recovery kullanılarak oluşturuldu)

fstab dosyalarını taşıma

Genel ramdisk'e yüklenen fstab dosyalarını vendor_ramdisk konumuna taşıyın. Örnek için bu değişikliğe bakın.

Modül yükleme

Cihaza özel modülleri vendor_ramdisk yükleyebilirsiniz (yüklenecek cihaza özel modülünüz yoksa bu adımı atlayın).

  • Modül /first_stage_ramdisk'ye yüklendiğinde modülün vendor_ramdisk varyantını kullanın. Bu modül, init kök dizini /first_stage_ramdisk olarak değiştirdikten sonra ancak init kök dizini /system olarak değiştirmeden önce kullanılabilir olmalıdır. Örnekler için Meta veri sağlama toplamları ve Sanal A/B sıkıştırma bölümlerine bakın.

  • Modül /'e yüklendiğinde modülün recovery varyantını kullanın. Bu modül, init kök dizini /first_stage_ramdisk olarak değiştirmeden önce kullanılabilir olmalıdır. Modüllerin /'ya yüklenmesiyle ilgili ayrıntılar için İlk aşama konsolu başlıklı makaleyi inceleyin.

İlk aşama konsolu

İlk aşama konsolu, init kökü /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 konumuna yüklenir. Bu nedenle, cihaz makefile'ı bu dosyadan devralınıyorsa 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, linker, sh ve toybox'nin $ANDROID_PRODUCT_OUT/recovery/root/system/bin'e, ardından $ANDROID_PRODUCT_OUT/recovery/root/system/bin'ün vendor_ramdisk altında /system/bin'e yüklenmesini sağlar.

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

PRODUCT_PACKAGES += adbd.recovery

Bu işlem, belirtilen modüllerin $ANDROID_PRODUCT_OUT/recovery/root/system/bin'ya yüklenmesini sağlar. Bu modüller daha sonra vendor_ramdisk altında /system/bin'ya yüklenir.

Meta veri sağlama toplamları

İlk aşama 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/first_stage_ramdisk/system/bin konumuna taşıyın:

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

Örnek için bu değişiklik listesine bakın.

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

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

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

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

  • Ramdisk build.prop, /second_stage_resources konumuna taşınır. Böylece ikinci aşama init, önyüklemenin derleme zaman damgasını okuyabilir.

Kaynaklar genel ramdiskten vendor_boot ramdiske taşındığından, genel ramdiskin vendor_boot ramdiske eklenmesinin sonucu değişmez.

e2fsck'yi kullanılabilir hale getirme

Cihaz makefile'ları şunlardan devralınabilir:

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

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

Ürün makefile'ları yüklenir $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck. Ç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.

Seçenek 2a: Özel ve A/B kurtarma bölümü

Bu seçeneği A/B recovery bölümleri olan cihazlar için kullanın. Yani cihazda recovery_a ve recovery_b partition bölümleri olmalıdır. Bu tür cihazlar arasında, kurtarma bölümü güncellenebilen aşağıdaki yapılandırmaya sahip A/B ve Virtual A/B cihazlar yer alır:

AB_OTA_PARTITIONS += recovery

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

  • Cihaza özel fstab dosyaları

  • lib/modules (tedarikçi çekirdek modülleri dahil)

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

BOARD değerlerini ayarlama

A/B recovery bölümü olan 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, /init -> /system/bin/init sembolik bağlantısını ve /system/bin/init konumundaki init_second_stage.recovery öğesini içerebilir. Ancak boot ramdisk, recovery ramdisk'ten sonra birleştirildiğinden /init sembolik bağlantısının üzerine yazılır. Cihaz Geri yükleme modunda başlatıldığında, ikinci aşama başlatma işlemini desteklemek için /system/bin/init ikili program gerekir.

Cihaz recovery'e başlatıldığında recovery + vendor_boot + genel ramdisklerin içeriği aşağıdaki gibidir:

  • /init (ramdiskten, init_first_stage kullanılarak oluşturuldu)
  • /system/bin/init (recovery ramdisk'ten, init_second_stage.recovery'den oluşturulmuş ve /init'den yürütülmüş)

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

  • /init (init_first_stage kullanılarak oluşturulan genel ramdisk'ten)

fstab dosyalarını taşıma

Genel ramdisk'e yüklenen fstab dosyalarını vendor_ramdisk konumuna taşıyın. Örnek için bu değişikliğe bakın.

Modül yükleme

İsteğe bağlı olarak, vendor_ramdisk için cihaza özel modüller yükleyebilirsiniz (yüklenecek cihaza özel modülünüz yoksa bu adımı atlayın). Init kök değiştirilmiyor. Modüllerin vendor_ramdisk varyantı, vendor_ramdisk kök dizinine yüklenir. vendor_ramdisk modüllerini yüklemeyle ilgili örnekler için Birinci aşama konsolu, Meta veri sağlama toplamları ve Sanal A/B sıkıştırma bölümlerine 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, linker, sh ve toybox'nin $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'e, ardından $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'ün vendor_ramdisk altında /system/bin'e yüklenmesini sağlar.

İ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, belirtilen modüllerin $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin konumuna yüklenmesini sağlar. vendor_boot ramdisk kurtarma modunda yüklenirse modül recovery'de de kullanılabilir. Kurtarma modunda vendor_boot ramdisk yüklenmezse cihaz isteğe bağlı olarak adbd.recovery da yükleyebilir.

Meta veri sağlama toplamları

İlk aşama 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 konumuna taşıyın:

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

Örnek için bu değişiklik listesine bakın.

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

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

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

Android'e önyükleme yaparken önyükleme süreci değişmez. vendor_boot + generic ramdisk, fstab'in vendor_boot'dan yüklenmesi dışında mevcut başlatma işlemine benzer. system/bin/recovery bulunmadığından first_stage_init, bunu normal bir başlatma işlemi olarak ele alır.

Kurtarma modunda başlatılırken başlatma işlemi değişir. Kurtarma + vendor_boot + genel ramdisk, mevcut kurtarma işlemine benzer ancak çekirdek, recovery görüntüsü yerine boot görüntüsünden yüklenir. Kurtarma modunda başlatma işlemi aşağıdaki gibidir.

  1. Önyükleyici başlatılır ve ardından şunlar yapılır:

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

  3. İlk aşama başlatılır ve ardından aşağıdakiler yapılır:

    1. IsRecoveryMode() == true ve ForceNormalBoot() == false değerlerini ayarlar.
    2. /lib/modules konumundan tedarikçi çekirdek modüllerini yükler.
    3. DoFirstStageMount() çağrısı yapılıyor ancak IsRecoveryMode() == true nedeniyle bağlama işlemi atlanıyor. (Cihaz, ramdisk'i boşaltmaz (çünkü / hâlâ aynıdır) ancak SetInitAvbVersionInRecovery()'i çağırır.)
    4. recovery ramdisk'inden /system/bin/init ile ikinci aşama başlatma işlemi başlatılıyor.

e2fsck'yi kullanılabilir hale getirme

Cihaz makefile'ları şunlardan devralınabilir:

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

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

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

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

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

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

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

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

recovery resmi bağımsız olmalıdır. Kurtarma modunu başlatmak için gereken tüm kaynakları içermelidir. Örneğin:

  • Çekirdek görüntüsü
  • DTBO görüntüsü
  • lib/modules içindeki çekirdek modülleri
  • Sembolik bağlantı olarak ilk aşama başlatma /init -> /system/bin/init
  • İkinci aşama başlatma ikilisi /system/bin/init
  • Cihaza özel fstab dosyaları
  • recovery ikili dosyası da dahil olmak üzere diğer tüm kurtarma kaynakları

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

BOARD değerlerini ayarlama

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 ramdiski bir /init -> /system/bin/init sembolik bağlantısı ve /system/bin/init konumunda init_second_stage.recovery içermelidir. Cihaz Geri yükleme modu [Recovery mode] modunda başlatıldığında hem birinci kademe hem de ikinci kademe başlatma işlemini desteklemek için /system/bin/init ikili program gerekir.

Cihaz recovery olarak başlatıldığında recovery ramdisklerinin içeriği aşağıdaki gibidir:

  • /init -> /system/bin/init (recovery ramdisk'ten)
  • /system/bin/init (recovery ramdisk'ten, init_second_stage.recovery'den oluşturulmuş ve /init'den yürütülmüş)

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

  • /init (ramdiskten, init_first_stage kullanılarak oluşturuldu)

fstab dosyalarını taşıma

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

Modül yükleme

Cihaza özel modülleri vendor_ramdisk ve recovery ramdisk'e yükleyebilirsiniz (yüklenecek cihaza özel modülünüz yoksa bu adımı atlayın). init kök değiştirilmiyor. Modüllerin vendor_ramdisk varyantı, vendor_ramdisk kök dizinine yüklenir. Modüllerin recovery varyantı, recovery ramdisk'in kök dizinine yüklenir. Modülleri vendor_ramdisk ve recovery ramdisk'e yükleme örnekleri için Birinci aşama konsolu ve Meta veri sağlama toplamları bölümlerine 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, linker, sh ve toybox'nin $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'e, ardından $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin'ün vendor_ramdisk altında /system/bin'e yüklenmesini sağlar.

İ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, belirtilen modüllerin $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin konumuna yüklenmesini sağlar.

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ı

İlk aşama 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 konumuna taşıyın:

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

Kurtarma sırasında ilk aşama bağlama işleminde meta veri sağlama toplamlarının desteklenmesi için bu modüllerin kurtarma varyantını etkinleştirin ve bunları da yükleyin.

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

Android'e önyükleme yaparken önyükleme süreci değişmez. vendor_boot + generic ramdisk, fstab'in vendor_boot'dan yüklenmesi dışında mevcut başlatma işlemine benzer. system/bin/recovery bulunmadığından first_stage_init, bunu normal bir başlatma işlemi olarak ele alır.

Kurtarma modunda başlatma işlemi değişmez. Kurtarma ramdiski, mevcut kurtarma işlemiyle aynı şekilde yüklenir. Çekirdek, recovery görüntüsünden yüklenir. Kurtarma modundaki başlatma süreci aşağıdaki gibidir.

  1. Önyükleyici başlatılır ve ardından şunlar yapılır:

    1. Kurtarma ramdiskini / konumuna gönderir.
    2. Çekirdeği recovery bölümünden çalıştırır.
  2. Çekirdek, ramdisk'i / konumuna bağlar ve ardından /init komutunu çalıştırır. Bu komut, recovery ramdisk'inden /system/bin/init konumuna sembolik bir bağlantıdır.

  3. İlk aşama başlatılır ve ardından aşağıdakiler yapılır:

    1. IsRecoveryMode() == true ve ForceNormalBoot() == false değerlerini ayarlar.
    2. /lib/modules konumundan tedarikçi çekirdek modüllerini yükler.
    3. DoFirstStageMount() çağrısı yapılıyor ancak IsRecoveryMode() == true nedeniyle bağlama işlemi atlanıyor. (Cihaz, ramdisk'i boşaltmaz (çünkü / hâlâ aynıdır) ancak SetInitAvbVersionInRecovery()'i çağırır.)
    4. recovery ramdisk'inden /system/bin/init ile ikinci aşama başlatma işlemi başlatılıyor.

Başlatma görüntüsü zaman damgaları

Aşağıdaki kod, boot resim zaman damgası dosyası örneğidir:

####################################
# 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, birinci aşama init, ramdisk'i boşaltmadan önce ramdisk'teki dosyaları tmpfs konumuna kopyalar. Böylece ikinci aşama init, boot resim zaman damgası özelliklerini ayarlamak için bu dosyayı okuyabilir.