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ın yükseltilmesi için genel ramdisk, yeni bir init_boot görüntüsü gerektirmeden olduğu yerde kalır.

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 durumda olan 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ükseltme yapan cihazlar, Android 12'de kullandıkları mimariyi kullanır.

Android 13 ile kullanıma sunulur, özel kurtarma yoktur

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

1. şekil. 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'ün yüklendiği 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

3.Şekil 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ı/GKI'yı başlatma/yükseltme, ö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'ye geçiş veya yükseltme, özel ve A/B kurtarma (özel ramdisk)

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

5.şekil 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'yi başlatma veya Android 12'ye yükseltme, özel ve A/B olmayan kurtarma (özel ramdisk)

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

6.şekil GKI, özel ve A/B olmayan kurtarma ile Android 12'ye yükseltilen veya Android 12 ile kullanıma sunulan 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'siz, recovery-as-boot 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 başlatma görüntüleri aşağıdakileri 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 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 resimlerinde bulunur.
  • 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 görüntüsü
      • lib/modules
      • Kurtarma kaynakları (özel kurtarma yoksa)
    • dtb resmi
  • recovery resmi

    • Ü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 üstbilgisinden çıkarılabilir.
    • recovery ramdisk görüntüsü
      • 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 modunu başlatmak için gereken tüm çekirdek modüllerini içermelidir.
      • Kurtarma ramdiski init içermelidir.
      • A/B kurtarma bölümünde, 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 önyükleme görüntüsündeki birinci aşama /init ikilisi 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ş önyükleme 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 boot resmi olarak recovery resmini 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 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ü olan cihazları 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) sürümünü 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 cihazlar PRODUCT_BUILD_RECOVERY_IMAGE değerini true veya boş olarak ayarlayabilir. Bu cihazlarda, BOARD_RECOVERYIMAGE_PARTITION_SIZE ayarlanmışsa recovery resmi oluşturulur.

Önyükleme 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 olarak 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 konumuna 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:

  • 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_arm64derleme 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 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'ten 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ş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 olarak 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'e yüklendiğinde modülün vendor_ramdisk varyantını kullanın. Bu modül, init kökünü /first_stage_ramdisk olarak değiştirdikten sonra ancak init kökünü /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ü /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ığı için 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 cihazlarının $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, ardından vendor_ramdisk altında /system/bin'ya yüklenmesini sağlar.

Meta veri sağlama toplamları

İlk aşama bağlama 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 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'ye 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, ikinci aşama init'nın önyüklemenin derleme zaman damgasını okuyabilmesi için /second_stage_resources'ye taşınır.

Kaynaklar genel ramdiskten vendor_boot ramdiskine taşındığı için genel ramdiskin vendor_boot ramdiskine eklenmesinin sonucu değişmez.

e2fsck'yi kullanılabilir hale getirme

Cihaz makefile'ları şu dosyalardan 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'i 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, /init -> /system/bin/init sembolik bağlantısını ve /system/bin/init konumunda 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 kurtarma modunda başlatıldığında, ikinci aşama başlatmayı desteklemek için /system/bin/init ikili dosyası gerekir.

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

  • /init (init_first_stage kullanılarak oluşturulan ramdisk'ten)
  • /system/bin/init (init_second_stage.recovery kaynağından oluşturulan ve /init konumundan yürütülen recovery ramdisk'ten)

Cihaz Android'e önyüklendiğinde vendor_boot + genel ramdisklerin 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 olarak 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ştirmiyor. Modüllerin vendor_ramdisk varyantı, vendor_ramdisk kök dizinine yüklenir. Modülleri vendor_ramdisk'ya yükleme örnekleri için Birinci aşama konsol, 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 cihazlarının $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 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 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, normal bir başlatma işlemi olarak ele alır.

Kurtarma modunda ö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ünden değil 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()'yi ç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ı şu dosyalardan 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 yürütülür /system/bin/e2fsck.

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

A/B olmayan recovery bölümü olan cihazlar için bu seçeneği 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 resmi
  • DTBO görüntüsü
  • lib/modules bölgesindeki ç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 ramdisk'i bir /init -> /system/bin/init sembolik bağlantısı ve /system/bin/init konumunda init_second_stage.recovery içermelidir. Cihaz kurtarma modunda başlatıldığında hem birinci aşama hem de ikinci aşama başlatma işlemini desteklemek için /system/bin/init ikili dosyası 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 (init_second_stage.recovery kaynağından oluşturulan ve /init konumundan yürütülen recovery ramdisk'ten)

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

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

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 olarak 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ştirmiyor. 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 cihazlarının $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 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 \

Kurtarma sırasında ilk aşama bağlama işleminde meta veri sağlama toplamalarını desteklemek 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, 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 işlemi 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 recovery ramdisk'indeki /system/bin/init konumuna sembolik bağlantı olan /init dosyasını çalıştırı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()'yi çağırır.)
    4. recovery ramdisk'inden /system/bin/init ile ikinci aşama başlatma işlemi başlatılıyor.

Önyükleme 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'ye kopyalar. Böylece ikinci aşama init, boot görüntü zaman damgası özelliklerini ayarlamak için bu dosyayı okuyabilir.