Dinamik bölümlendirme, Linux çekirdeğinde dm-linear cihaz eşleyici modülü kullanılarak uygulanır. super
bölümü, super
içindeki her dinamik bölümün adlarını ve blok aralıklarını listeleyen meta veriler içerir. İlk aşama init
sırasında bu meta veriler ayrıştırılır ve doğrulanır ve her bir dinamik bölümü temsil edecek şekilde sanal blok cihazlar oluşturulur.
OTA uygulanırken dinamik bölümler otomatik olarak oluşturulur, yeniden boyutlandırılır veya gerektiğinde silinir. A/B cihazlarda meta verilerin iki kopyası vardır ve değişiklikler yalnızca hedef yuvayı temsil eden kopyaya uygulanır.
Dinamik bölümler kullanıcı alanında uygulandığından bootloader'ın ihtiyaç duyduğu bölümler dinamik hale getirilemez. Örneğin, boot
, dtbo
ve vbmeta
önyükleme yükleyici tarafından okunur ve bu nedenle fiziksel bölüm olarak kalmalıdır.
Her dinamik bölüm bir güncelleme grubuna ait olabilir. Bu gruplar, gruptaki bölümlerin kullanabileceği maksimum alanı sınırlar.
Örneğin, system
ve vendor
, system
ile vendor
'un toplam boyutunu kısıtlayan bir gruba ait olabilir.
Yeni cihazlarda dinamik bölümleri uygulama
Bu bölümde, Android 10 ve sonraki sürümlerin yüklü olduğu yeni cihazlarda dinamik bölümlerin nasıl uygulanacağı ayrıntılı olarak açıklanmaktadır. Mevcut cihazları güncellemek için Android cihazları güncelleme başlıklı makaleyi inceleyin.
Bölüm değişiklikleri
Android 10 ile kullanıma sunulan cihazlar için super
adlı bir bölüm oluşturun. super
bölümünün A/B yuvaları dahili olarak işlediği için A/B cihazların ayrı super_a
ve super_b
bölümlerine ihtiyacı yoktur.
Önyükleyici tarafından kullanılmayan tüm salt okunur AOSP bölümleri dinamik olmalı ve GUID bölüm tablosundan (GPT) kaldırılmalıdır.
Tedarikçiye özgü bölümlerin dinamik olması gerekmez ve GPT'ye yerleştirilebilir.
super
boyutunu tahmin etmek için GPT'den silinen bölümlerin boyutlarını ekleyin. A/B cihazlarda bu, her iki yuvayı da içermelidir. Şekil 1'de, dinamik bölümlere dönüştürülmeden önce ve sonra örnek bir bölüm tablosu gösterilmektedir.
Desteklenen dinamik bölümler şunlardır:
- Sistem
- Satıcı
- Ürün
- Sistem Uzatma
- ODM
Android 10 ile kullanıma sunulan cihazlarda, sysprop ro.boot.super_partition
komutunun boş olması için çekirdek komut satırı seçeneği androidboot.super_partition
boş olmalıdır.
Bölüm hizası
super
bölümü düzgün şekilde hizalanmamışsa device-mapper modülü daha az verimli çalışabilir. super
bölümünün, blok katmanı tarafından belirlenen minimum G/Ç istek boyutuna hizalanması ZORUNLUDUR. Derleme sistemi (super
bölüm resmini oluşturan lpmake
aracılığıyla), varsayılan olarak her dinamik bölüm için 1 MiB'lik bir uyumun yeterli olduğunu varsayar. Ancak tedarikçiler, super
bölümünün doğru şekilde hizalandığından emin olmalıdır.
sysfs
inceleyerek blok cihazın minimum istek boyutunu belirleyebilirsiniz. Örnek:
# ls -l /dev/block/by-name/super lrwxrwxrwx 1 root root 16 1970-04-05 01:41 /dev/block/by-name/super -> /dev/block/sda17 # cat /sys/block/sda/queue/minimum_io_size 786432
super
bölümünün hizalamasını benzer şekilde doğrulayabilirsiniz:
# cat /sys/block/sda/sda17/alignment_offset
Hizalama uzaklığı 0 OLMALIDIR.
Cihaz yapılandırmasında değişiklik
Dinamik bölümlemeyi etkinleştirmek için device.mk
bölümüne aşağıdaki işareti ekleyin:
PRODUCT_USE_DYNAMIC_PARTITIONS := true
Tahta yapılandırmasında yapılan değişiklikler
super
bölümünün boyutunu ayarlamanız gerekir:
BOARD_SUPER_PARTITION_SIZE := <size-in-bytes>
A/B cihazlarda dinamik bölüm resimlerinin toplam boyutu super
bölüm boyutunun yarısından fazlaysa derleme sistemi hata verir.
Dinamik bölümlerin listesini aşağıdaki gibi yapılandırabilirsiniz. Güncelleme gruplarını kullanan cihazlar için grupları BOARD_SUPER_PARTITION_GROUPS
değişkeninde listeleyin. Her grup adında bir BOARD_group_SIZE
ve BOARD_group_PARTITION_LIST
değişkeni bulunur.
A/B cihazlarda grup adları dahili olarak slot son ekiyle belirtildiği için bir grubun maksimum boyutu yalnızca bir yuvayı kapsamalıdır.
Tüm bölümleri example_dynamic_partitions
adlı bir gruba yerleştiren örnek bir cihazı aşağıda görebilirsiniz:
BOARD_SUPER_PARTITION_GROUPS := example_dynamic_partitions BOARD_EXAMPLE_DYNAMIC_PARTITIONS_SIZE := 6442450944 BOARD_EXAMPLE_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor product
Sistem ve ürün hizmetlerini group_foo
, vendor
, product
ve odm
'i group_bar
içine yerleştiren örnek bir cihazı aşağıda görebilirsiniz:
BOARD_SUPER_PARTITION_GROUPS := group_foo group_bar BOARD_GROUP_FOO_SIZE := 4831838208 BOARD_GROUP_FOO_PARTITION_LIST := system product_services BOARD_GROUP_BAR_SIZE := 1610612736 BOARD_GROUP_BAR_PARTITION_LIST := vendor product odm
-
Sanal A/B başlatma cihazları için tüm grupların maksimum boyutlarının toplamı en fazla şu kadar olmalıdır:
BOARD_SUPER_PARTITION_SIZE
- ek yük
Sanal A/B'yi Uygulama bölümüne bakın. -
A/B lansman cihazları için tüm grupların maksimum boyutlarının toplamı şu olmalıdır:
BOARD_SUPER_PARTITION_SIZE
/ 2 - genel maliyet -
A/B olmayan cihazlar ve sonradan A/B yapılandırılmış cihazlar için tüm grupların maksimum boyutlarının toplamı şu olmalıdır:
BOARD_SUPER_PARTITION_SIZE
- genel giderler - Derleme sırasında, bir güncelleme grubundaki her bölümün resimlerinin boyutlarının toplamı, grubun maksimum boyutunu aşmamalıdır.
- Meta verileri, hizalamaları vb. hesaba katmak için hesaplamada ek yük gereklidir. Makul bir yedek 4 MiB'dir ancak cihazın ihtiyacına göre daha büyük bir yedek seçebilirsiniz.
Dinamik bölümlerin boyutunu ayarlama
Dinamik bölümlerden önce, gelecekteki güncellemeler için yeterli alana sahip olmalarını sağlamak amacıyla bölüm boyutları fazladan ayrılıyordu. Gerçek boyut olduğu gibi alındı ve salt okunur bölümlerin çoğunun dosya sisteminde bir miktar boş alan vardı. Dinamik bölümlerdeki bu boş alan kullanılamaz ve OTA sırasında bölümleri büyütmek için kullanılabilir. Bölmelerin yer israf etmediğinden ve mümkün olan en küçük boyuta ayrıldığından emin olmak
Salt okunur ext4 görüntülerinde, sabit kodlu bölüm boyutu belirtilmediyse derleme sistemi minimum boyutu otomatik olarak ayırır. Derleme sistemi görüntüyü sığdırır, böylece dosya sisteminde kullanılmayan alan mümkün olduğunca az olur. Bu, cihazın OTA'lar için kullanılabilecek alanı harcamasını önler.
Ayrıca, blok düzeyinde tekilleştirme etkinleştirilerek ext4 resimleri daha da sıkıştırılabilir. Bunu etkinleştirmek için aşağıdaki yapılandırmayı kullanın:
BOARD_EXT4_SHARE_DUP_BLOCKS := true
Bir bölümün minimum boyutunun otomatik olarak ayrılması istenmiyorsa bölüm boyutunu kontrol etmenin iki yolu vardır. BOARD_partitionIMAGE_PARTITION_RESERVED_SIZE
ile minimum boş alan belirtebilir veya dinamik bölümleri belirli bir boyuta zorlamak için BOARD_partitionIMAGE_PARTITION_SIZE
belirtebilirsiniz. Gerekli olmadıkça bunların hiçbiri önerilmez.
Örnek:
BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE := 52428800
Bu işlem, product.img
dosya sisteminin 50 MiB kullanılmayan alana sahip olmasını zorunlu kılar.
Kök olarak sistem değişiklikleri
Android 10 ile kullanıma sunulan cihazlar, kök olarak sistem kullanmamalıdır.
Dinamik bölümlere sahip cihazlar (dinamik bölümlerle kullanıma sunulsun veya sonradan eklensin) kök olarak sistem kullanmamalıdır. Linux çekirdeği super
bölümünü yorumlayamadığı için system
'i bağlayamıyor. system
artık ramdisk'te bulunan ilk aşama init
tarafından monte edilir.
BOARD_BUILD_SYSTEM_ROOT_IMAGE
özelliğini ayarlamayın. Android 10'da BOARD_BUILD_SYSTEM_ROOT_IMAGE
işaretçisi yalnızca sistemin çekirdek tarafından mı yoksa ramdisk'teki ilk aşama init
tarafından mı monte edildiğini ayırt etmek için kullanılır.
BOARD_BUILD_SYSTEM_ROOT_IMAGE
değerinin true
olarak ayarlanması, PRODUCT_USE_DYNAMIC_PARTITIONS
aynı zamanda true
olduğunda derleme hatasına neden olur.
BOARD_USES_RECOVERY_AS_BOOT
doğru olarak ayarlandığında, kurtarma görüntüsü, kurtarma işleminin ramdisk'ini içeren boot.img olarak oluşturulur. Daha önce önyükleyici, hangi modda başlatılacağına karar vermek için skip_initramfs
çekirdek komut satırı parametresini kullanıyordu. Android 10 cihazlarda önyükleme aracı, skip_initramfs
değerini çekirdek komut satırına İLETMEMELİDİR. Bunun yerine, önyükleyici, kurtarma işlemini atlayıp normal Android'i başlatmak için androidboot.force_normal_boot=1
değerini iletmelidir. Android 12 veya sonraki sürümlerle kullanıma sunulan cihazlar, androidboot.force_normal_boot=1
değerini iletmek için bootconfig kullanmalıdır.
AVB yapılandırma değişiklikleri
Android Doğrulanmış Başlatma 2.0 kullanılırken cihazda zincirlenmiş bölüm tanımlayıcısı kullanılmıyorsa değişiklik gerekmez. Ancak zincirlenmiş bölümler kullanılıyorsa ve doğrulanmış bölümlerden biri dinamikse değişiklik yapılması gerekir.
system
ve vendor
bölümleri için vbmeta
zincirini kullanan bir cihaza ilişkin örnek yapılandırmayı aşağıda görebilirsiniz.
BOARD_AVB_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 BOARD_AVB_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VENDOR_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VENDOR_ROLLBACK_INDEX_LOCATION := 1
Bootloader, bu yapılandırmayla system
ve vendor
bölümlerinin sonunda bir vbmeta altbilgi bulmayı bekler. Bu bölümler artık önyükleme yükleyici tarafından görülemediğinden (super
içinde bulunurlar) iki değişiklik yapılması gerekir.
-
Cihazın bölüm tablosuna
vbmeta_system
vevbmeta_vendor
bölümünü ekleyin. A/B cihazları içinvbmeta_system_a
,vbmeta_system_b
,vbmeta_vendor_a
vevbmeta_vendor_b
değerlerini ekleyin. Bu bölümlerden bir veya daha fazlasını ekleyecekseniz bunlarvbmeta
bölümüyle aynı boyutta olmalıdır. -
VBMETA_
ekleyerek yapılandırma bayraklarını yeniden adlandırın ve zincirlemenin hangi bölümleri kapsadığını belirtin:BOARD_AVB_VBMETA_SYSTEM := system BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 BOARD_AVB_VBMETA_VENDOR := vendor BOARD_AVB_VBMETA_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_VENDOR_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX_LOCATION := 1
Bir cihaz bu bölümlerden birini veya ikisini birden kullanıyor olabilir ya da hiçbirini kullanmıyor olabilir. Yalnızca mantıksal bir bölümlendirmeye zincir oluştururken değişiklik yapılması gerekir.
AVB bootloader değişiklikleri
Bootloader'da libavb yerleşikse aşağıdaki yamaları ekleyin:
- 818cf56740775446285466eda984acedd4baeac0 — "libavb: Bölüm GUID'lerini yalnızca cmdline'nin ihtiyaç duyduğu durumlarda sorgula."
- 5abd6bc2578968d24406d834471adfd995a0c2e9 — "İzin ver sistem bölümü eksik"
- 9ba3b6613b4e5130fa01a11d984c6b5f0eb3af05 — "Düzeltme AvbSlotVerifyData->cmdline NULL olabilir"
Zincirlenmiş bölümler kullanıyorsanız ek bir yama ekleyin:
- 49936b4c0109411fdd38bd4ba3a32a01c40439a9 — "libavb: Bölümün başında vbmeta blob'larını destekleyin."
Çekirdek komut satırı değişiklikleri
Çekirdek komut satırına androidboot.boot_devices
adlı yeni bir parametre eklenmelidir. Bu, init
tarafından /dev/block/by-name
sembolik bağlantıyı etkinleştirmek için kullanılır. Bu, ueventd
tarafından oluşturulan temel ad sembolü bağlantısının cihaz yolu bileşeni (yani /dev/block/platform/device-path/by-name/partition-name
) olmalıdır.
Android 12 veya sonraki sürümlerle başlatılan cihazlar androidboot.boot_devices
eklentisini init
uygulamasına aktarmak için bootconfig'i kullanmalıdır.
Örneğin, adla süper bölüm sembolik bağlantısı /dev/block/platform/soc/100000.ufshc/by-name/super
ise komut satırı parametresini BoardConfig.mk dosyasına aşağıdaki gibi ekleyebilirsiniz:
BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/100000.ufshc
BOARD_BOOTCONFIG += androidboot.boot_devices=soc/100000.ufshc
fstab değişiklikleri
Cihaz ağacı ve cihaz ağacı yer paylaşımları fstab girişleri içermemelidir. Ramdisk'in parçası olacak bir fstab dosyası kullanın.
Mantıksal bölümler için fstab dosyasında değişiklik yapılmalıdır:
-
fs_mgr flags alanında
logical
işareti ve Android 10'da kullanıma sunulanfirst_stage_mount
işareti bulunmalıdır. Bu işaret, bir bölümün ilk aşamada monte edileceğini belirtir. -
Bir bölümlendirme,
avb=vbmeta partition name
öğesinifs_mgr
işareti olarak belirtebilir ve ardından belirtilenvbmeta
bölümü, herhangi bir cihaz eklenmeye çalışmadan önce ilk aşamainit
tarafından başlatılır. -
dev
alanı, bölüm adıdır.
Aşağıdaki fstab girişleri, sistem, tedarikçi ve ürünü yukarıdaki kurallara göre mantıksal bölümler olarak ayarlar.
#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags> system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount
fstab dosyasını ilk aşama ramdisk'e kopyalayın.
SELinux değişiklikleri
Süper bölüm blok cihazı super_block_device
etiketiyle işaretlenmelidir. Örneğin, adla süper bölüm simge bağlantısı /dev/block/platform/soc/100000.ufshc/by-name/super
ise
file_contexts
dosyasına aşağıdaki satırı ekleyin:
/dev/block/platform/soc/10000\.ufshc/by-name/super u:object_r:super_block_device:s0
hızlı önyükleme
Önyükleyici (veya kullanıcı alanı dışındaki herhangi bir yanıp sönme aracı), dinamik bölümleri anlayamadığı için bunları yanıp sönemez. Bu sorunu gidermek için cihazların, fastboot protokolünün kullanıcı alanındaki bir uygulamasını (fastbootd) kullanması gerekir.
Fastbootd'un nasıl uygulanacağı hakkında daha fazla bilgi için Fastboot'u Kullanıcı Alanı'na Taşıma bölümüne bakın.
adb remount
adb remount
, eng veya userdebug derlemelerini kullanan geliştiriciler için hızlı iterasyon açısından son derece yararlıdır. Dinamik bölümler, her dosya sisteminde artık boş yer olmadığı için adb remount
için sorun teşkil eder. Bu sorunu gidermek için cihazlar overlayfs'i etkinleştirebilir. Süper bölümde boş alan olduğu sürece adb remount
, otomatik olarak geçici bir dinamik bölüm oluşturur ve yazma işlemleri için yer paylaşımlı fişleri kullanır. Geçici bölüm scratch
olarak adlandırılır. Bu nedenle, diğer bölümler için bu adı kullanmayın.
Overlayfs'in nasıl etkinleştirileceği hakkında daha fazla bilgi için AOSP'deki overlayfs README dosyasını inceleyin.
Android cihazları yükseltme
Bir cihazı Android 10'a yükseltirseniz ve OTA'ya dinamik bölümlendirme desteğini dahil etmek isterseniz yerleşik bölüm tablosunu değiştirmeniz gerekmez. Ek yapılandırma gerekebilir.
Cihaz yapılandırmasında değişiklik
Dinamik bölümlemeyi sonradan eklemek için device.mk
dosyasına aşağıdaki işaretleri ekleyin:
PRODUCT_USE_DYNAMIC_PARTITIONS := true PRODUCT_RETROFIT_DYNAMIC_PARTITIONS := true
Tahta yapılandırmasında yapılan değişiklikler
Aşağıdaki pano değişkenlerini ayarlamanız gerekir:
BOARD_SUPER_PARTITION_BLOCK_DEVICES
değerini, dinamik bölüm kapsamlarını depolamak için kullanılan blok cihazlarının listesine ayarlayın. Bu, cihazdaki mevcut fiziksel bölümlerin adlarının listesidir.BOARD_SUPER_PARTITION_partition_DEVICE_SIZE
değerini,BOARD_SUPER_PARTITION_BLOCK_DEVICES
'deki her blok cihazın boyutlarına göre ayarlayın. Bu, cihazdaki mevcut fiziksel bölümlerin boyutlarının listesidir. Bu değer, mevcut kart yapılandırmalarında genellikleBOARD_partitionIMAGE_PARTITION_SIZE
değerindedir.BOARD_SUPER_PARTITION_BLOCK_DEVICES
'daki tüm bölümler için mevcutBOARD_partitionIMAGE_PARTITION_SIZE
ayarını kaldırın.BOARD_SUPER_PARTITION_SIZE
değerini,BOARD_SUPER_PARTITION_partition_DEVICE_SIZE
toplamına ayarlayın.BOARD_SUPER_PARTITION_METADATA_DEVICE
değerini, dinamik bölüm meta verilerinin depolandığı blok cihaz olarak ayarlayın. Aşağıdakilerden biri olmalıdır:BOARD_SUPER_PARTITION_BLOCK_DEVICES
. Bu değer genelliklesystem
olarak ayarlanır.- Sırasıyla
BOARD_SUPER_PARTITION_GROUPS
,BOARD_group_SIZE
veBOARD_group_PARTITION_LIST
değerlerini ayarlayın. Ayrıntılar için Yeni cihazlarda anakart yapılandırmasında yapılan değişiklikler başlıklı makaleyi inceleyin.
Örneğin, cihazda zaten sistem ve tedarikçi bölümleri varsa ve bunları dinamik bölümlere dönüştürmek ve güncelleme sırasında yeni bir ürün bölümü eklemek istiyorsanız şu kart yapılandırmasını ayarlayın:
BOARD_SUPER_PARTITION_BLOCK_DEVICES := system vendor BOARD_SUPER_PARTITION_METADATA_DEVICE := system # Rename BOARD_SYSTEMIMAGE_PARTITION_SIZE to BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE. BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE := <size-in-bytes> # Rename BOARD_VENDORIMAGE_PARTITION_SIZE to BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE := <size-in-bytes> # This is BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE + BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE BOARD_SUPER_PARTITION_SIZE := <size-in-bytes> # Configuration for dynamic partitions. For example: BOARD_SUPER_PARTITION_GROUPS := group_foo BOARD_GROUP_FOO_SIZE := <size-in-bytes> BOARD_GROUP_FOO_PARTITION_LIST := system vendor product
SELinux değişiklikleri
Süper bölüm bloğu cihazları super_block_device_type
özelliğiyle işaretlenmelidir. Örneğin, cihazda zaten system
ve vendor
bölümleri varsa bunları dinamik bölümlerin kapsamlarını depolamak için blok cihaz olarak kullanmak istiyorsunuz ve adlarına göre sembolik bağlantıları system_block_device
olarak işaretlenmiş:
/dev/block/platform/soc/10000\.ufshc/by-name/system u:object_r:system_block_device:s0 /dev/block/platform/soc/10000\.ufshc/by-name/vendor u:object_r:system_block_device:s0
Ardından device.te
dosyasına aşağıdaki satırı ekleyin:
typeattribute system_block_device super_block_device_type;
Diğer yapılandırmalar için Yeni cihazlara dinamik bölümleri uygulama bölümünü inceleyin.
Geri yükleme güncellemeleri hakkında daha fazla bilgi edinmek için Dinamik bölüm içermeyen A/B cihazlar için OTA başlıklı makaleyi inceleyin.
Fabrika ayarı görüntüleri
Dinamik bölüm desteğiyle kullanıma sunulan cihazlarda, kullanıcı alanına önyükleme yapmak diğer önyükleme yöntemlerinden daha yavaş olduğundan fabrika görüntülerini yüklemek için kullanıcı alanı hızlı önyükleme özelliğini kullanmaktan kaçının.
Bu sorunu gidermek için make dist
artık doğrudan süper bölüme yazılabilen ek bir super.img
resmi oluşturuyor. Mantıksal bölümlerin içeriğini otomatik olarak gruplandırır. Yani super
bölüm meta verilerine ek olarak system.img
, vendor.img
vb. içerir. Bu resim, ek araç olmadan veya fastbootd kullanılarak doğrudan super
bölümüne yazılabilir. Derleme işleminden sonra super.img
, ${ANDROID_PRODUCT_OUT}
içine yerleştirilir.
Dinamik bölümle başlatılan A/B cihazlarda super.img
, A yuvasındaki resimleri içerir. Süper görüntüyü doğrudan yükledikten sonra, cihazı yeniden başlatmadan önce A yuvasını önyüklenebilir olarak işaretleyin.
make dist
, güçlendirme cihazları için doğrudan ilgili fiziksel bölümlere yansıtılabilecek bir super_*.img
görüntü grubu oluşturur. Örneğin, BOARD_SUPER_PARTITION_BLOCK_DEVICES
sistem tedarikçisi olduğunda make dist
, super_system.img
ve super_vendor.img
'yi oluşturur. Bu görüntüler, target_files.zip
konumundaki OTA klasörüne yerleştirilir.
Cihaz haritalayıcı depolama cihazı ayarı
Dinamik bölümleme, bir dizi nondeterministic device-mapper nesnesini barındırır. Bunların tümü beklendiği gibi oluşturulmayabilir. Bu nedenle, tüm bağlamaları izlemeniz ve ilişkili tüm bölümlerin Android özelliklerini temel depolama cihazlarıyla güncellemeniz gerekir.
init
içindeki bir mekanizma, bağlamaları izler ve Android mülklerini eşzamansız olarak günceller. Bu sürenin belirli bir dönem içinde olacağı garanti edilmez. Bu nedenle, tüm on property
tetikleyicilerinin tepki vermesi için yeterli süre sağlamanız gerekir. Örneğin <partition>
, root
, system
, data
veya vendor
olduğu dev.mnt.blk.<partition>
mülklerdir. Her mülk, aşağıdaki örneklerde gösterildiği gibi temel depolama cihazı adıyla ilişkilendirilir:
taimen:/ % getprop | grep dev.mnt.blk [dev.mnt.blk.data]: [sda] [dev.mnt.blk.firmware]: [sde] [dev.mnt.blk.metadata]: [sde] [dev.mnt.blk.persist]: [sda] [dev.mnt.blk.root]: [dm-0] [dev.mnt.blk.vendor]: [dm-1] blueline:/ $ getprop | grep dev.mnt.blk [dev.mnt.blk.data]: [dm-4] [dev.mnt.blk.metadata]: [sda] [dev.mnt.blk.mnt.scratch]: [sda] [dev.mnt.blk.mnt.vendor.persist]: [sdf] [dev.mnt.blk.product]: [dm-2] [dev.mnt.blk.root]: [dm-0] [dev.mnt.blk.system_ext]: [dm-3] [dev.mnt.blk.vendor]: [dm-1] [dev.mnt.blk.vendor.firmware_mnt]: [sda]
init.rc
dili, Android mülklerinin kurallar kapsamında genişletilmesine olanak tanır. Depolama cihazları, platform tarafından aşağıdaki gibi komutlarla gerektiği şekilde ayarlanabilir:
write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb 128 write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb 128
İkinci aşamada komut işleme başladığında init
etkinleşir ve epoll loop
değerleri güncellenmeye başlar. Ancak mülk tetikleyicileri init
'ün sonlarına kadar etkin olmadığından root
, system
veya vendor
ile ilgili işlemleri yapmak için ilk önyükleme aşamalarında kullanılamaz. init.rc
komut dosyalarının early-fs
'de geçersiz kılması (çeşitli daemon'lar ve tesisler başladığında) için çekirdek varsayılan read_ahead_kb
değerinin yeterli olmasını bekleyebilirsiniz. Bu nedenle Google, aşağıdaki örneklerde olduğu gibi operasyonların zamanlamasını yönetmek ve yarış koşullarını önlemek için on property
özelliğini sys.read_ahead_kb
gibi init.rc
kontrollü bir özellik ile birlikte kullanmanızı önerir:
on property:dev.mnt.blk.root=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.system=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.system}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.vendor=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.vendor}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.product=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.system_ext}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.oem=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.oem}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.data=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on early-fs: setprop sys.read_ahead_kb ${ro.read_ahead_kb.boot:-2048} on property:sys.boot_completed=1 setprop sys.read_ahead_kb ${ro.read_ahead_kb.bootcomplete:-128}