Dinamik bölümlendirme, Linux çekirdeğindeki dm-linear device-mapper
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 verileri içerir. İlk aşamada init
bu meta veriler ayrıştırılıp doğrulanır ve her dinamik bölümü temsil etmek için sanal blok cihazlar oluşturulur.
OTA uygulandığında dinamik bölümler otomatik olarak oluşturulur, yeniden boyutlandırılır veya gerektiğinde silinir. A/B cihazlarda meta verilerin iki kopyası bulunur ve değişiklikler yalnızca hedef yuvanın kopyasına uygulanır.
Dinamik bölümler kullanıcı alanında uygulandığından, önyükleyici tarafından gereken bölümler dinamik hale getirilemez. Örneğin, boot
, dtbo
ve vbmeta
önyükleyici tarafından okunur ve bu nedenle fiziksel bölümler olarak kalmalıdır.
Her dinamik bölüm bir güncelleme grubuna ait olabilir. Bu gruplar, söz konusu gruptaki bölümlerin kullanabileceği maksimum alanı sınırlar.
Örneğin, system
ve vendor
, system
ve vendor
'nin 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ümlerle kullanıma sunulan yeni cihazlarda dinamik bölümlerin nasıl uygulanacağı ayrıntılı olarak açıklanmaktadır. Mevcut cihazları güncellemek için Android cihazları yükseltme 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ü, A/B yuvalarını dahili olarak işler. Bu nedenle, 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 özel 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 cihazlar için bu, her iki alanın boyutunu içermelidir. Şekil 1'de, dinamik bölümlere dönüştürmeden önce ve sonraki örnek bir bölüm tablosu gösterilmektedir.

Desteklenen dinamik bölümler şunlardır:
- Sistem
- Satıcı
- Ürün
- System Ext
- ODM
Android 10 ile kullanıma sunulan cihazlarda, sysprop komutunun ro.boot.super_partition
boş olması için çekirdek komut satırı seçeneği androidboot.super_partition
boş olmalıdır.
Bölüm hizalaması
super
bölümü düzgün şekilde hizalanmamışsa device-mapper modülü daha az verimli çalışabilir. super
bölümü, blok katmanı tarafından belirlenen minimum G/Ç isteği boyutuna göre hizalanmalıdır. Varsayılan olarak, derleme sistemi (lpmake
aracılığıyla, super
bölüm görüntüsünü oluşturur) her dinamik bölüm için 1 MiB hizalamanın yeterli olduğunu varsayar. Ancak tedarikçiler, super
bölümünün düzgün şekilde hizalandığından emin olmalıdır.
Bir blok cihazın minimum istek boyutunu sysfs
inceleyerek belirleyebilirsiniz. Örneğin:
# 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ı da benzer şekilde doğrulayabilirsiniz:
# cat /sys/block/sda/sda17/alignment_offset
Hizalama ofseti 0 OLMALIDIR.
Cihaz yapılandırma değişiklikleri
Dinamik bölümlemeyi etkinleştirmek için device.mk
öğesine aşağıdaki işareti ekleyin:
PRODUCT_USE_DYNAMIC_PARTITIONS := true
Jamboard yapılandırma değişiklikleri
super
bölümünün boyutunu ayarlamanız gerekir:
BOARD_SUPER_PARTITION_SIZE := <size-in-bytes>
A/B cihazlarda, derleme sistemi dinamik bölüm resimlerinin toplam boyutu super
bölüm boyutunun yarısından fazlaysa 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 BOARD_group_SIZE
ve BOARD_group_PARTITION_LIST
değişkeni bulunur.
A/B cihazlarda, grup adlarına dahili olarak yuva son eki eklendiğinden bir grubun maksimum boyutu yalnızca bir yuvayı kapsamalıdır.
Aşağıda, tüm bölümleri example_dynamic_partitions
adlı bir gruba yerleştiren bir cihaz örneği verilmiştir:
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
'yi group_bar
'ye yerleştiren bir cihaz örneği:
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 lansman cihazlarında, 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 başlıklı makaleyi inceleyin. -
A/B lansman cihazları için tüm grupların maksimum boyutlarının toplamı şu olmalıdır:
BOARD_SUPER_PARTITION_SIZE
/ 2 - ek yük -
A/B olmayan cihazlar ve A/B'ye dönüştürülen cihazlar için tüm grupların maksimum boyutlarının toplamı şu olmalıdır:
BOARD_SUPER_PARTITION_SIZE
- ek yük - 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 gerekir. Makul bir ek yük 4 MiB'dir ancak cihazın ihtiyacına göre daha büyük bir ek yük seçebilirsiniz.
Boyut dinamik bölümleri
Dinamik bölümlerden önce, gelecekteki güncellemeler için yeterli alan olduğundan emin olmak amacıyla bölüm boyutları fazla ayrılıyordu. Gerçek boyut olduğu gibi alınmış ve salt okunur bölümlerin çoğunun dosya sisteminde bir miktar boş alan bulunmuştur. Dinamik bölümlerde bu boş alan kullanılamaz ve OTA sırasında bölümleri büyütmek için kullanılabilir. Bölümlerin yer israfına yol açmadığından ve mümkün olan en küçük boyuta ayrıldığından emin olmak çok önemlidir.
Salt okunur ext4 resimler için, sabit kodlanmış bir bölüm boyutu belirtilmemişse derleme sistemi otomatik olarak minimum boyutu ayırır. Derleme sistemi, dosya sisteminde mümkün olduğunca az kullanılmayan alan olacak şekilde görüntüyü yerleştirir. Bu sayede cihaz, OTA'lar için kullanılabilecek alanı boşa harcamaz.
Ayrıca, ext4 görüntüleri blok düzeyinde tekilleştirme etkinleştirilerek 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
Bölüm 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 miktarını belirtebilir veya dinamik bölümleri belirli bir boyuta zorlamak için BOARD_partitionIMAGE_PARTITION_SIZE
değerini belirtebilirsiniz. Gerekli olmadığı sürece bu yöntemlerin ikisi de önerilmez.
Örneğin:
BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE := 52428800
Bu işlem, product.img
dosya sisteminin 50 MiB kullanılmayan alana sahip olmasını zorlar.
System-as-root değişiklikleri
Android 10 ile kullanıma sunulan cihazlar, sistemin root olarak kullanıldığı bir yapılandırmaya sahip olmamalıdır.
Dinamik bölümlerle başlatılan veya dinamik bölümlerin sonradan eklendiği cihazlarda sistem kök olarak kullanılmamalıdır. Linux çekirdeği super
bölümünü yorumlayamadığı için system
bölümünü bağlayamıyor. system
artık ramdisk'te bulunan init
ilk aşaması tarafından monte ediliyor.
BOARD_BUILD_SYSTEM_ROOT_IMAGE
ayarlamayın. Android 10'da BOARD_BUILD_SYSTEM_ROOT_IMAGE
işareti 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ğerini true
olarak ayarlamak,
PRODUCT_USE_DYNAMIC_PARTITIONS
değeri de true
olduğunda derleme hatasına neden olur.
BOARD_USES_RECOVERY_AS_BOOT
true olarak ayarlandığında kurtarma görüntüsü, kurtarmanın ramdisk'ini içeren boot.img olarak oluşturulur. Daha önce, önyükleyici hangi modda önyükleme yapılacağına karar vermek için skip_initramfs
çekirdek
komut satırı parametresini kullanıyordu. Android 10 cihazlarda önyükleyici, çekirdek komut satırına skip_initramfs
iletmemelidir. Bunun yerine, önyükleyici, kurtarma modunu atlayıp normal Android'i başlatmak için androidboot.force_normal_boot=1
değerini iletmelidir. Android 12 veya sonraki sürümlerle piyasaya sürülen cihazlar, androidboot.force_normal_boot=1
'yı geçmek için bootconfig'i kullanmalıdır.
AVB yapılandırma değişiklikleri
Android Doğrulanmış Başlatma 2.0 kullanılırken cihaz zincirleme bölüm tanımlayıcıları kullanmıyorsa herhangi bir değişiklik yapılması gerekmez. Ancak zincirleme 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
zincirleme kullanan bir cihazın örnek yapılandırmasını aşağıda bulabilirsiniz.
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
Bu yapılandırmada, önyükleyici system
ve vendor
bölümlerinin sonunda bir vbmeta
altbilgisi bulmayı bekler. Bu bölümler artık önyükleyici tarafından görülemediğinden (super
içinde yer alırlar) iki değişiklik yapılması gerekir.
-
Cihazın bölüm tablosuna
vbmeta_system
vevbmeta_vendor
bölümlerini ekleyin. A/B cihazları içinvbmeta_system_a
,vbmeta_system_b
,vbmeta_vendor_a
vevbmeta_vendor_b
'ü ekleyin. Bu bölümlerden bir veya daha fazlası ekleniyorsavbmeta
bölümüyle aynı boyutta olmalıdır. -
VBMETA_
ekleyerek yapılandırma işaretlerini yeniden adlandırın ve zincirlemenin hangi bölümlere kadar uzandığı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, ikisini veya hiçbirini kullanmıyor olabilir. Değişiklikler yalnızca mantıksal bir bölüme zincirleme yaparken gereklidir.
AVB bootloader değişiklikleri
Önyükleyicide libavb yerleştirilmişse, aşağıdaki yamaları ekleyin:
- 818cf56740775446285466eda984acedd4baeac0 — "libavb: Only query partition GUIDs when the cmdline needs them." ("libavb: Yalnızca komut satırı gerektiğinde bölüm GUID'lerini sorgulayın.")
- 5abd6bc2578968d24406d834471adfd995a0c2e9 — "Allow system partition to be absent" (Sistem bölümünün olmamasına izin ver)
- 9ba3b6613b4e5130fa01a11d984c6b5f0eb3af05 — "Fix AvbSlotVerifyData->cmdline might be NULL"
Zincirleme bölümler kullanılıyorsa 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 yeni bir parametre (androidboot.boot_devices
) eklenmelidir. Bu, init
tarafından /dev/block/by-name
sembolik bağlantılarını etkinleştirmek için kullanılır. Bu, ueventd
tarafından oluşturulan temel ada göre sembolik bağlantının cihaz yolu bileşeni olmalıdır. Yani /dev/block/platform/device-path/by-name/partition-name
.
Android 12 veya sonraki sürümlerle kullanıma sunulan cihazlar, androidboot.boot_devices
değerini init
değerine iletmek 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 BoardConfig.mk dosyasına komut satırı parametresini 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ı katmanları 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ılması gerekir:
-
fs_mgr flags alanı, Android 10'da kullanıma sunulan
logical
işaretini ve bir bölümün ilk aşamada bağlanacağını belirtenfirst_stage_mount
işaretini içermelidir. -
Bir bölüm,
avb=vbmeta partition name
olarak birfs_mgr
işareti belirtebilir. Ardından, belirtilenvbmeta
bölümü, herhangi bir cihazı bağlamaya çalışmadan önce ilk aşamainit
tarafından başlatılır. -
dev
alanı bölüm adı olmalıdır.
Aşağıdaki fstab girişleri, yukarıdaki kurallara göre sistemi, satıcıyı ve ürünü 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'ine kopyalayın.
SELinux değişiklikleri
Süper bölüm blok cihazı, super_block_device
etiketiyle işaretlenmelidir. Örneğin, ada göre süper bölümleme sembolik 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
fastbootd
Önyükleyici (veya kullanıcı alanı dışındaki herhangi bir yanıp sönme aracı) dinamik bölümleri anlamadığından bunları yanıp söndüremez. Bu sorunu gidermek için cihazların fastbootd adlı fastboot protokolünün kullanıcı alanı uygulamasını kullanması gerekir.
fastbootd'yi uygulama hakkında daha fazla bilgi için Moving Fastboot to User Space (Fastboot'u Kullanıcı Alanına Taşıma) başlıklı makaleyi inceleyin.
adb remount
eng veya userdebug derlemelerini kullanan geliştiriciler için adb remount
hızlı yineleme açısından son derece yararlıdır. Dinamik bölümler, her dosya sisteminde artık boş alan olmadığı için adb remount
açısından sorun teşkil eder. Bu sorunu gidermek için cihazlar overlayfs'yi etkinleştirebilir. Süper bölüm içinde boş alan olduğu sürece adb remount
, geçici bir dinamik bölümü otomatik olarak oluşturur ve yazma işlemleri için overlayfs'yi kullanır. Geçici bölümün adı scratch
olduğundan bu adı diğer bölümler için kullanmayın.
overlayfs'yi etkinleştirme hakkında daha fazla bilgi için AOSP'deki overlayfs README dosyasına bakın.
Android cihazları yükseltme
Bir cihazı Android 10'a yükseltirseniz ve OTA'ya dinamik bölümler desteğini eklemek isterseniz yerleşik bölüm tablosunu değiştirmeniz gerekmez. Bazı ek yapılandırmalar gereklidir.
Cihaz yapılandırma değişiklikleri
Dinamik bölümlemeyi geriye dönük olarak uygulamak için device.mk
bölümüne aşağıdaki işaretleri ekleyin:
PRODUCT_USE_DYNAMIC_PARTITIONS := true PRODUCT_RETROFIT_DYNAMIC_PARTITIONS := true
Jamboard yapılandırma değişiklikleri
Aşağıdaki pano değişkenlerini ayarlamanız gerekir:
BOARD_SUPER_PARTITION_BLOCK_DEVICES
değerini, dinamik bölümlerin kapsamlarını depolamak için kullanılan engellenen cihazları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
içindeki her bir blok cihazın boyutlarına ayarlayın. Bu, cihazdaki mevcut fiziksel bölümlerin boyutlarının listesidir. Bu genellikle mevcut kart yapılandırmalarındaBOARD_partitionIMAGE_PARTITION_SIZE
şeklindedir.BOARD_SUPER_PARTITION_BLOCK_DEVICES
içindeki tüm bölümler için mevcutBOARD_partitionIMAGE_PARTITION_SIZE
ayarını kaldırın.BOARD_SUPER_PARTITION_SIZE
değeriniBOARD_SUPER_PARTITION_partition_DEVICE_SIZE
toplamı olarak ayarlayın.BOARD_SUPER_PARTITION_METADATA_DEVICE
değerini, dinamik bölüm meta verilerinin depolandığı cihazı engelleyecek şekilde ayarlayın. Şunlardan 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 kart yapılandırması değişiklikleri başlıklı makaleye bakın.
Örneğin, cihazda zaten sistem ve satıcı 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 bu 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 blok 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 cihazlar olarak kullanmak istiyorsunuz ve adla sembolik bağlantıları system_block_device
olarak işaretleniyor:
/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 cihazlarda dinamik bölümleri uygulama başlıklı makaleyi inceleyin.
Retrofit güncellemeleri hakkında daha fazla bilgi için Dinamik Bölümler Olmayan A/B Cihazlar İçin OTA başlıklı makaleyi inceleyin.
Fabrika görüntüleri
Dinamik bölümleri destekleyen bir cihazı kullanıma sunarken fabrika görüntülerini yüklemek için kullanıcı alanı fastboot'u kullanmaktan kaçının. Kullanıcı alanına önyükleme, diğer yükleme yöntemlerine göre daha yavaştır.
Bu sorunu gidermek için make dist
artık doğrudan süper bölüme yüklenebilen ek bir super.img
görüntü oluşturuyor. Mantıksal bölümlerin içeriklerini otomatik olarak paketler. Bu nedenle, super
bölüm meta verilerine ek olarak system.img
, vendor.img
vb. içerir. Bu görüntü, ek araçlar olmadan veya fastbootd kullanmadan doğrudan super
bölümüne yüklenebilir. Derlemeden sonra super.img
, ${ANDROID_PRODUCT_OUT}
içine yerleştirilir.
Dinamik bölümlerle kullanıma sunulan A/B cihazları için super.img
, A alanındaki görüntüleri içerir. Super görüntüsü doğrudan yüklendikten sonra cihazı yeniden başlatmadan önce A yuvasını önyüklenebilir olarak işaretleyin.
Retrofit cihazlar için make dist
, doğrudan ilgili fiziksel bölümlere yüklenebilen bir dizi super_*.img
görüntüsü oluşturur. Örneğin, make dist
, super_system.img
ve super_vendor.img
oluşturur. BOARD_SUPER_PARTITION_BLOCK_DEVICES
, sistem satıcısıdır. Bu resimler, target_files.zip
konumundaki OTA klasörüne yerleştirilir.
Cihaz eşleyici depolama cihazı ayarlama
Dinamik bölümleme, deterministik olmayan çeşitli device-mapper nesnelerini barındırır. Bunların tümü beklendiği gibi başlatılamayabilir. Bu nedenle, tüm bağlama işlemlerini izlemeniz ve ilişkili tüm bölümlerin Android özelliklerini temel alınan depolama cihazlarıyla güncellemeniz gerekir.
init
içindeki bir mekanizma, bağlama işlemlerini izler ve Android özelliklerini eşzamansız olarak günceller. Bu işlemin belirli bir süre içinde tamamlanacağı garanti edilmez. Bu nedenle, tüm on property
tetikleyicilerinin tepki vermesi için yeterli süre tanımalısınız. Özellikler dev.mnt.blk.<partition>
şeklindedir. Örneğin, <partition>
, root
, system
, data
veya vendor
olabilir. Her özellik, bu ö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 özelliklerinin kurallar kapsamında genişletilmesine olanak tanır. Depolama cihazları, platform tarafından gerektiğinde aşağıdaki gibi komutlarla 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 init
komut işleme başladıktan sonra epoll loop
etkin hale gelir ve değerler güncellenmeye başlar. Ancak mülk tetikleyicileri init
'nın sonlarına kadar etkin olmadığından root
, system
veya vendor
'ü işlemek için ilk başlatma aşamalarında kullanılamazlar. init.rc
komut dosyaları early-fs
içinde geçersiz kılınana kadar (çeşitli arka plan programları ve tesisler başlatıldığında) çekirdek varsayılanı read_ahead_kb
'nın yeterli olmasını bekleyebilirsiniz. Bu nedenle Google, işlemlerin zamanlamasını yönetmek ve yarış durumu sorunlarını önlemek için on property
özelliğini sys.read_ahead_kb
gibi init.rc
tarafından kontrol edilen bir mülkle birlikte kullanmanızı önerir. Örneğin:
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}