Genel Önyükleme 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 ramdisk, boot görüntüsünden kaldırılır ve ayrı bir init_boot görüntüsüne yerleştirilir. Bu değişiklik, boot görüntüsünü yalnızca GKI çekirdeğinde bırakır.

Android 12 veya daha eski çekirdek sürümlerini kullanmaya devam eden cihazların yükseltilmesi için genel ramdisk, yeni bir init_boot görüntüsüne gerek kalmadan olduğu yerde kalır.

Genel bir ramdisk oluşturmak için satıcıya özel kaynakları, genel ramdiskin yalnızca ilk aşama init ve zaman damgası bilgilerini içeren bir özellik dosyasını içerecek şekilde ramdiskin dışına taşıyın.

Şu özelliklere sahip cihazlarda:

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

  • Özel bir recovery bölümü kullanın; recovery ramdiski bağımsız olduğundan recovery ramdiskinde herhangi bir değişiklik yapılmasına gerek yoktur.

Mimari

Aşağıdaki diyagramlar Android 12 ve üstünü çalıştıran cihazların mimarisini göstermektedir. Android 13 ile başlatılan cihazlarda genel ramdisk'i içeren yeni bir init_boot görüntüsü bulunur. Android 12'den Android 13'e yükseltilen cihazlar, Android 12'de kullanılan mimarinin aynısını kullanır.

Android 13 ile başlatın, özel kurtarma gerekmez

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

Şekil 1. GKI ile Android 13'ü başlatan veya bu sürüme yükseltilen, özel kurtarma işlemi olmayan cihazlar

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

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

Şekil 2. GKI, özel ve A/B kurtarma özellikli Android 13'ü başlatan veya bu sürüme yükseltilen cihazlar

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

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

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'ü başlatan veya bu sürüme yükseltilen cihazlar

Aygıtta yuva son eki olmayan recovery adlı bir bölüm varsa bu şekle bakın.

Android 12'yi başlatın veya bu sürüme yükseltin; özel kurtarma gerekmez

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

Şekil 4. GKI ile Android 12'yi başlatan veya Android 12'ye yükselten, özel kurtarma işlemi olmayan cihazlar

Özel ve A/B kurtarma (özel ramdisk) Android 12'yi başlatın veya bu sürüme yükseltin

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

Şekil 5. GKI, özel ve A/B kurtarma özellikli Android 12'yi başlatan veya bu sürüme yükseltilen cihazlar

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

Özel ve A/B olmayan kurtarma (özel ramdisk) Android 12'yi başlatın veya bu sürüme yükseltin

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

Şekil 6. GKI, özel ve A/B olmayan kurtarma ile Android 12'yi başlatan veya bu sürüme yükseltilen cihazlar

Aygıtta yuva son eki olmayan recovery adlı bir bölüm varsa bu şekle bakın.

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

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

Şekil 7. Android 12'ye yükseltilen, GKI olmayan, önyükleme olarak kurtarmalı 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üleri içerikleri

Android önyükleme görüntüleri aşağıdakileri içerir.

  • Android 13 ile başlatılan cihazlar için init_boot görüntüsü eklendi

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

    • Başlık sürümü V3 veya V4
      • GKI boot.img sertifikası için bir boot_signature (yalnızca v4). Sertifikalı GKI boot.img dosyası, doğrulanmış önyükleme için imzalanmadı. OEM'lerin önceden oluşturulmuş boot.img dosyasını yine de cihaza özel bir AVB anahtarıyla imzalaması gerekir.
      • 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ülerine dahildir
  • vendor_boot görüntüsü (ayrıntılar için bkz. Satıcı Önyükleme Bölümleri )

    • vendor_boot başlığı
      • Cihaza özel cmdline ( BOARD_KERNEL_CMDLINE )
    • vendor_boot ramdisk görüntüsü
      • lib/modules
      • Kurtarma kaynakları (özel kurtarma yoksa)
    • dtb resmi
  • recovery görüntüsü

    • Başlık sürümü V2
      • Gerekirse kurtarma için cihaza özel cmdline
      • A/B olmayan kurtarma bölümü için başlığın içeriği bağımsız olmalıdır; bkz. Kurtarma Görüntüleri . Örneğin:
      • cmdline boot ve vendor_boot cmdline ile birleştirilmemiştir.
      • Başlık, gerekirse kurtarma DTBO'sunu belirtir.
      • A/B kurtarma bölümü için içerikler birleştirilebilir veya boot ve vendor_boot çıkarılabilir. Örneğin:
      • cmdline boot ve vendor_boot cmdline birleştirilir.
      • DTBO, vendor_boot başlığından çıkarılabilir.
    • recovery ramdisk görüntüsü
      • Kurtarma kaynakları
      • A/B olmayan kurtarma bölümü için, ramdiskin içeriği bağımsız olmalıdır; bkz. Kurtarma Görüntüleri . Örneğin:
      • lib/modules kurtarma modunu başlatmak için gereken tüm çekirdek modüllerini içermelidir
      • Kurtarma ramdiskinin init içermesi gerekir.
      • A/B kurtarma bölümü için kurtarma ramdiski, jenerik ve vendor_boot ramdiskinin önüne eklenir, dolayısıyla bağımsız olması gerekmez. Örneğin:
      • lib/modules vendor_boot ramdisk'teki ç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ündeki ilk aşama /init ikili dosyası 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 eklendi
  • ro. PRODUCT .bootimg.* build malzemeleri
  • 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/

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

Derleme bayrakları init_boot , boot , recovery ve vendor_boot görüntülerinin nasıl oluşturulduğunu denetler. Boolean board değişkeninin değeri true dizesi olmalı veya boş olmalıdır (bu varsayılandır).

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

  • BOARD_USES_RECOVERY_AS_BOOT . Bu değişken, aygıtın recovery görüntüsünü boot görüntüsü olarak kullanıp kullanmadığını gösterir. GKI kullanırken bu değişken boştur ve kurtarma kaynaklarının vendor_boot taşınması gerekir.

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

    Bu, kart düzeyindeki GKI anahtarıdır; Aşağıda listelenen tüm değişkenler bu değişken tarafından kısıtlanmıştır.

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

    • true olarak ayarlandığında, kurtarma kaynakları yalnızca vendor-ramdisk/ e oluşturulur ve recovery/root/ a 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 oluşturulup oluşturulmadığını kontrol eder.

    • true olarak ayarlandığında BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT ise:

      • Ayarlandığında, GSI AVB anahtarları $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb olarak oluşturulur.

      • Ayarlanmadığında, GSI AVB anahtarları $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb olarak oluşturulur.

    • Boş olduğunda BOARD_RECOVERY_AS_ROOT ise:

      • Ayarlandığında, GSI AVB anahtarları $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb olarak oluşturulur.

      • Ayarlanmadığında, GSI AVB anahtarları $ANDROID_PRODUCT_OUT/ramdisk/avb olarak 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 başlatılan ve A/B recovery bölümünü kullanan cihazların bu değişkeni true olarak ayarlaması gerekir. Android 12 ile başlatılan ve A/B olmayanı kullanan cihazların, kurtarma görüntüsünün bağımsız kalması için bu değişkeni false olarak ayarlaması gerekir.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES . Bu değişken $OUT/boot*.img hedef dosyalar altındaki IMAGES/ dosyası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 dosyasının oluşturulup oluşturulmadığını kontrol eder ve boyutu ayarlar. Ayarlandığında genel ramdisk, boot.img yerine init_boot.img dosyasına 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 recovery bölümü olmadan cihazı yükseltme Cihazı recovery bölümüyle yükseltme Cihazı recovery bölümü olmadan başlatın Cihazı A/B recovery bölümüyle başlatın Cihazı A/B olmayan recovery bölümüyle başlatın aosp_arm64
boot içerir Evet Evet Evet Evet Evet Evet
init_boot içerir (Android 13) HAYIR HAYIR Evet Evet Evet Evet
vendor_boot içerir isteğe bağlı isteğe bağlı Evet Evet Evet HAYIR
recovery içerir HAYIR Evet HAYIR Evet Evet HAYIR
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 ya da boş boş true ya da boş true ya da 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 bir recovery bölümüne sahip cihazlar, PRODUCT_BUILD_RECOVERY_IMAGE öğesini true veya boş olarak ayarlayabilir. Bu cihazlar için BOARD_RECOVERYIMAGE_PARTITION_SIZE ayarlanmışsa bir recovery görüntüsü oluşturulur.

Önyükleme için zincirleme vbmeta'yı etkinleştir

boot ve init_boot görüntüleri için zincirleme vbmeta'nın etkinleştirilmesi gerekir. 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 olarak bu değişikliğe bakın.

Kök olarak sistem

Kök olarak sistem, GKI kullanan cihazlarda desteklenmez. Bu tür cihazlarda BOARD_BUILD_SYSTEM_ROOT_IMAGE boş olmalıdır. Kök olarak sistem, dinamik bölümleri kullanan cihazlarda da desteklenmez.

Ürün konfigürasyonları

Genel ramdisk'i kullanan aygıtların, ramdisk'e kurulmasına izin verilen dosyaların bir listesini yüklemesi gerekir. Bunu yapmak için, device.mk dosyasında aşağıdakileri belirtin:

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

generic_ramdisk.mk dosyası ayrıca diğer makefile dosyalarının yanlışlıkla başka dosyaları ramdisk'e yüklemesini de önler (bu tür dosyaları bunun yerine vendor_ramdisk taşıyın).

Cihazları kurma

Kurulum talimatları, Android 13 ile başlatılan, Android 12'ye yükseltilen ve Android 12 ile başlatılan cihazlar arasında farklılık gösterir. Android 13, Android 12'dekine benzer şekilde kurulur

  • Android 12'ye Yükseltilen Cihazlar:

    • BOARD_USES_RECOVERY_AS_BOOT değerini koruyabilir. Bunu yaparlarsa eski yapılandırmaları kullanıyorlardır ve yeni yapı değişkenlerinin boş olması gerekir. Bu tür cihazlar varsa:

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

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

    • BOARD_USES_RECOVERY_AS_BOOT boş olarak ayarlanabilir. Eğer bunu yaparlarsa, yeni konfigürasyonlar kullanıyorlardır. Bu tür cihazlar varsa:

  • Android 12 ile başlatılan cihazların BOARD_USES_RECOVERY_AS_BOOT boş ve yeni yapılandırmaları kullanacak şekilde ayarlaması gerekir. Bu tür cihazlar varsa:

aosp_arm64 yalnızca GKI oluşturduğundan (ve vendor_boot veya kurtarmayı oluşturmadığından) tam bir hedef değildir. aosp_arm64 yapı yapılandırmaları için generic_arm64 bakın.

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

recovery bölümü olmayan aygıtlar, boot bölümünde genel boot görüntüsünü içerir. vendor_boot ramdisk'i, lib/modules (satıcı çekirdek modülleriyle birlikte) dahil olmak üzere tüm kurtarma kaynaklarını içerir. Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk dosyasından devralınır .

KART değerlerinin ayarlanması

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 ramdiski, /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'inden sonra birleştirildiğinden, /init sembolik bağlantısının üzerine yazılır. Cihaz kurtarma işlemine önyüklendiğinde, ikinci aşama başlatmayı desteklemek için /system/bin/init ikili dosyasına ihtiyaç vardır. vendor_boot + jenerik ramdisklerin içerikleri aşağıdaki gibidir:

  • /init ( init_first_stage oluşturulan genel ramdisk'ten)
  • /system/bin/init ( vendor_ramdisk , init_second_stage.recovery oluşturulmuş)

fstab dosyalarını taşıma

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

Modülleri yükleme

İsterseniz cihaza özel modülleri vendor_ramdisk yükleyebilirsiniz (kurmanız gereken cihaza özel modülleriniz yoksa bu adımı atlayın).

  • Modül /first_stage_ramdisk kurulduğunda modülün vendor_ramdisk değişkenini kullanın. Bu modül init kökü /first_stage_ramdisk olarak değiştirdikten sonra, ancak init kökü /system olarak değiştirmeden önce mevcut olmalıdır. Örnekler için bkz. Meta veri sağlama toplamları ve Sanal A/B sıkıştırması .

  • Modül / konumuna yüklendiğinde modülün recovery varyantını kullanın. Bu modül, init kökü /first_stage_ramdisk olarak değiştirmesinden önce mevcut olmalıdır. Modülleri / konumuna yüklemeyle ilgili ayrıntılar için bkz. Birinci aşama konsolu .

İ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 çeşidi build/make/target/product/base_vendor.mk dosyasına yüklenir; dolayısıyla, cihazın makefile dosyası bu dosyadan miras alı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, linker , sh ve toybox $ANDROID_PRODUCT_OUT/recovery/root/system/bin dizinine kurulmasını ve daha sonra vendor_ramdisk altında /system/bin dizinine yüklenmesini sağlar.

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

PRODUCT_PACKAGES += adbd.recovery

Bu, belirtilen modüllerin $ANDROID_PRODUCT_OUT/recovery/root/system/bin dizinine kurulmasını ve ardından vendor_ramdisk altındaki /system/bin dizinine yüklenmesini sağlar.

Meta veri sağlama toplamları

İlk aşama montajı sırasında meta veri sağlama toplamları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 olarak bu değişiklik listesine bakın.

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

Sanal A/B sıkıştırmasını desteklemek için snapuserd vendor_ramdisk kurulmalıdır. Cihaz, snapuserd vendor_ramdisk değişkenini yükleyen virtual_ab_ota/compression.mk dosyasından miras almalıdır.

Önyükleme işlemindeki değişiklikler

Kurtarmaya veya Android'e önyükleme işlemi aşağıdaki istisna dışında değişmez:

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

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

e2fsck'i kullanılabilir hale getirme

Cihaz makefile dosyaları aşağıdakilerden miras alabilir:

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

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

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

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

A/B recovery bölümlerine sahip cihazlar için bu seçeneği kullanın; yani cihazın bir recovery_a ve recovery_b partition vardır. Bu tür cihazlar, aşağıdaki yapılandırmaya sahip, kurtarma bölümünün güncellenebildiği A/B ve Sanal A/B cihazlarını içerir:

AB_OTA_PARTITIONS += recovery

vendor_boot ramdiski, aşağıdakiler de dahil olmak üzere, ramdisk ve satıcı çekirdek modüllerinin satıcı bitlerini içerir:

  • Cihaza özel fstab dosyaları

  • lib/modules (satıcı çekirdek modüllerini içerir)

recovery ramdiski tüm kurtarma kaynaklarını içerir. Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk dosyasından devralınır .

KART değerlerinin ayarlanması

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 ramdiski bir /init -> /system/bin/init sembolik bağlantısı ve /system/bin/init konumunda init_second_stage.recovery içerebilir. Ancak, önyükleme ramdiski recovery ramdiskinden sonra birleştirildiğinden, /init sembolik bağlantısının üzerine yazılır. Cihaz kurtarma moduna geçtiğinde, ikinci aşama başlatmayı desteklemek için /system/bin/init ikili dosyasına ihtiyaç vardır.

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

  • /init (ramdisk'ten, init_first_stage oluşturulmuş)
  • /system/bin/init ( init_second_stage.recovery dosyasından oluşturulan ve /init dosyasından yürütülen recovery ramdiskinden)

Cihaz Android'e ön yükleme yaptığında vendor_boot + jenerik ramdisklerin içerikleri aşağıdaki gibidir:

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

fstab dosyalarını taşıma

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

Modülleri yükleme

İsterseniz cihaza özel modülleri vendor_ramdisk yükleyebilirsiniz (kurmanız gereken cihaza özel modülleriniz yoksa bu adımı atlayın). Init kökü değiştirmez. Modüllerin vendor_ramdisk çeşidi, vendor_ramdisk köküne kurulur. vendor_ramdisk modül yükleme örnekleri için bkz. Birinci aşama konsolu , Meta veri sağlama toplamları ve Sanal A/B sıkıştırması .

İlk aşama konsolu

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

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Bu, linker , sh ve toybox $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin adresine kurulmasını ve daha sonra vendor_ramdisk altında /system/bin dizinine kurulmasını sağlar.

İlk aşama konsolu için gereken modülleri (örneğin adbd) eklemek için 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 adresine yüklenmesini sağlar. vendor_boot ramdisk'i kurtarma modunda yüklenmişse, modül recovery modunda da kullanılabilir. vendor_boot ramdisk'i kurtarma modunda yüklenmemişse, cihaz isteğe bağlı olarak adbd.recovery de yükleyebilir.

Meta veri sağlama toplamları

İlk aşama montajı sırasında meta veri sağlama toplamları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 olarak bu değişiklik listesine bakın.

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

Sanal A/B sıkıştırmasını desteklemek için snapuserd vendor_ramdisk kurulmalıdır. Cihaz, snapuserd vendor_ramdisk değişkenini yükleyen virtual_ab_ota/compression.mk dosyasından miras almalıdır.

Önyükleme işlemindeki değişiklikler

Android'e önyükleme yaparken önyükleme işlemi değişmez. vendor_boot + jenerik ramdiski, fstab vendor_boot yüklenmesi dışında mevcut önyükleme işlemine benzer. system/bin/recovery mevcut olmadığından, first_stage_init bunu normal bir önyükleme gibi ele alır.

Kurtarma moduna önyükleme yaparken önyükleme 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 modu için önyükleme işlemi aşağıdaki gibidir.

  1. Bootloader başlar ve ardından aşağıdakileri yapar:

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

  3. İlk aşama init başlar, ardından aşağıdakileri yapar:

    1. IsRecoveryMode() == true ve ForceNormalBoot() == false ayarlar.
    2. Satıcı çekirdek modüllerini /lib/modules konumundan yükler.
    3. DoFirstStageMount() öğesini çağırır ancak IsRecoveryMode() == true olduğundan montajı atlar. (Cihaz ramdisk'i serbest bırakmıyor (çünkü / hala aynı) ancak SetInitAvbVersionInRecovery() çağırıyor.)
    4. İkinci aşama başlatmayı recovery ramdiskindeki /system/bin/init konumundan başlatır.

e2fsck'i kullanılabilir hale getirme

Cihaz makefile dosyaları aşağıdakilerden miras alabilir:

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

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

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

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

A/B olmayan recovery bölümüne sahip cihazlar için bu seçeneği kullanın; yani aygıtta yuva son eki olmayan recovery adlı bir bölüm vardır. Bu tür cihazlar şunları içerir:

  • A/B olmayan cihazlar;
  • Kurtarma bölümü güncellenemeyen A/B ve Sanal A/B cihazları. (Bu alışılmadık bir durum.)

vendor_boot ramdiski, aşağıdakiler de dahil olmak üzere, ramdisk ve satıcı çekirdek modüllerinin satıcı bitlerini içerir:

  • Cihaza özel fstab dosyaları
  • lib/modules (satıcı çekirdek modüllerini içerir)

recovery görüntüsü bağımsız olmalıdır. Aşağıdakiler dahil, kurtarma modunu başlatmak için gerekli tüm kaynakları içermelidir:

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

Bu tür cihazlarda ürün yapılandırması generic_ramdisk.mk dosyasından devralınır .

KART değerlerinin ayarlanması

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 kurtarma moduna önyüklendiğinde, hem birinci aşamayı hem de ikinci aşama başlatmayı desteklemek için /system/bin/init ikili dosyasına ihtiyaç vardır.

Cihaz recovery işlemine geçtiğinde recovery ramdisklerinin içeriği aşağıdaki gibidir:

  • /init -> /system/bin/init ( recovery ramdiskinden)
  • /system/bin/init ( init_second_stage.recovery dosyasından oluşturulan ve /init dosyasından yürütülen recovery ramdiskinden)

Cihaz Android'e ön yükleme yaptığında vendor_boot + jenerik ramdisklerin içerikleri aşağıdaki gibidir:

  • /init (ramdisk'ten, init_first_stage oluşturulmuş)

fstab dosyalarını taşıma

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

Modülleri yükleme

İstenirse, vendor_ramdisk ve recovery ramdisk'ine cihaza özel modüller yükleyebilirsiniz (kurmanız gereken cihaza özel modülleriniz yoksa bu adımı atlayın). init kökü değiştirmez. Modüllerin vendor_ramdisk çeşidi, vendor_ramdisk köküne kurulur. Modüllerin recovery çeşidi, recovery ramdiskinin köküne yüklenir. vendor_ramdisk ve recovery ramdisk'ine modül yükleme örnekleri için, bkz. İlk aşama konsolu ve Meta Veri sağlama toplamları .

İlk aşama konsolu

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

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Bu, linker , sh ve toybox $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin adresine kurulmasını ve daha sonra vendor_ramdisk altında /system/bin dizinine kurulmasını sağlar.

İlk aşama konsolu için gereken modülleri (örneğin adbd) eklemek için 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 adresine yüklenmesini sağlar.

Modüllerin recovery sürümünü yüklemek için vendor_ramdisk recovery ile değiştirin:

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

Meta veri sağlama toplamları

İlk aşama montajı sırasında meta veri sağlama toplamları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 \

Kurtarmanın ilk aşaması sırasında meta veri sağlama toplamlarını desteklemek için bu modüllerin kurtarma varyantını etkinleştirin ve bunları da yükleyin.

Önyükleme işlemindeki değişiklikler

Android'e önyükleme yaparken önyükleme işlemi değişmez. vendor_boot + jenerik ramdiski, fstab vendor_boot yüklenmesi dışında mevcut önyükleme işlemine benzer. system/bin/recovery mevcut olmadığından, first_stage_init bunu normal bir önyükleme gibi ele alır.

Kurtarma moduna önyükleme yaparken önyükleme 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 modu için önyükleme işlemi aşağıdaki gibidir.

  1. Bootloader başlar ve ardından aşağıdakileri yapar:

    1. Kurtarma ramdisk'ini / konumuna iter.
    2. Çekirdeği recovery bölümünden çalıştırır.
  2. Çekirdek, ramdisk'i / dizinine bağlar ve ardından recovery ramdiskinden /system/bin/init bir sembolik bağlantı olan /init komutunu çalıştırır.

  3. İlk aşama init başlar, ardından aşağıdakileri yapar:

    1. IsRecoveryMode() == true ve ForceNormalBoot() == false ayarlar.
    2. Satıcı çekirdek modüllerini /lib/modules konumundan yükler.
    3. DoFirstStageMount() öğesini çağırır ancak IsRecoveryMode() == true olduğundan montajı atlar. (Cihaz ramdisk'i serbest bırakmıyor (çünkü / hala aynı) ancak SetInitAvbVersionInRecovery() çağırıyor.)
    4. İkinci aşama başlatmayı recovery ramdiskindeki /system/bin/init konumundan başlatır.

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

Aşağıdaki kod, örnek bir boot görüntüsü 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 yapının zaman damgası bilgilerini içerir.

  • Çalışma zamanında, ilk aşama init ramdisk'i serbest bırakmadan önce dosyaları ramdisk'ten tmpfs kopyalar , böylece ikinci aşama init boot görüntüsü zaman damgası özelliklerini ayarlamak için bu dosyayı okuyabilir .