Yeni bir cihazda sanal A/B testi uygulamak veya kullanıma sunulmuş bir cihazı uyarlamak için cihaza özel kodda değişiklik yapmanız gerekir.
İşaret oluşturma
Sanal A/B kullanan cihazlar A/B cihazı olarak yapılandırılmalı ve dinamik bölümlerle başlatılmalıdır.
Sanal A/B ile kullanıma sunulan cihazları, sanal A/B cihaz taban yapılandırmasını devralacak şekilde ayarlayın:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Sanal A/B ile kullanıma sunulan cihazlarda, B yuvaları artık süperde olmadığından BOARD_SUPER_PARTITION_SIZE
için yalnızca yarı yarıya daha az kart boyutu gerekir. Yani BOARD_SUPER_PARTITION_SIZE
, sum(size of update groups) + overhead değerine eşit veya bu değerden büyük olmalıdır. Bu değer de sum(size of partitions) + overhead değerine eşit veya bu değerden büyük olmalıdır.
Android 13 ve sonraki sürümlerde, sanal A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek için aşağıdaki temel yapılandırmayı devralın:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
Bu, no-op sıkıştırma yöntemi kullanılırken Virtual A/B ile kullanıcı alanı anlık görüntülerinin alınmasını sağlar. Ardından,sıkıştırma yöntemini desteklenen yöntemlerden biri olan zstd
ve lz4
olarak yapılandırabilirsiniz. Android 15'te sıkıştırma, cihaz ihtiyaçlarına uyacak şekilde daha da özelleştirilebilir. Daha fazla bilgi için Sıkıştırmayı ince ayarlama başlıklı makaleyi inceleyin.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Android 12'de, Virtual A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek için aşağıdaki temel yapılandırmayı devralın:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
XOR sıkıştırması
Android 13 ve sonraki sürümlere yükseltilen cihazlarda XOR sıkıştırma özelliği varsayılan olarak etkinleştirilmez. XOR sıkıştırmayı etkinleştirmek için cihazın .mk
dosyasına aşağıdakileri ekleyin.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
XOR sıkıştırma, android_t_baseline.mk
öğesinden devralan cihazlarda varsayılan olarak etkindir.
Kullanıcı alanı birleştirme
Sanal A/B'nin modern sürümünde (Android T ve sonraki sürümler) anlık görüntü birleştirme işlemi tamamen kullanıcı alanında gerçekleşir. Bu değişiklik, snapuserd ve dm-user sayesinde mümkün olmaktadır. Android 13 ve sonraki sürümlerle kullanıma sunulan cihazlarda kullanıcı alanı birleştirme özelliği varsayılan olarak etkindir. Daha eski cihazlarda ise bu özellik, yükseltme sırasında aşağıdaki yöntemlerle ayarlanabilir:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Başlatma kontrolü HAL'si
Önyükleme kontrolü HAL, OTA istemcilerinin önyükleme yuvalarını kontrol etmesi için bir arayüz sağlar. Virtual A/B, önyükleyici yazılımının yanıp sönme veya fabrika ayarlarına sıfırlama sırasında korunmasını sağlamak için ek API'ler gerektiğinden önyükleme denetimi HAL'inin küçük sürüm yükseltmesini gerektirir. HAL tanımının en son sürümü için IBootControl.hal ve types.hal dosyalarına bakın.
// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };
// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
setSnapshotMergeStatus(MergeStatus status)
generates (bool success);
getSnapshotMergeStatus()
generates (MergeStatus status);
}
// Recommended implementation
Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
// Write value to persistent storage
// e.g. misc partition (using libbootloader_message)
// bootloader rejects wipe when status is SNAPSHOTTED
// or MERGING
}
Fstab değişiklikleri
Meta veri bölümünün bütünlüğü, özellikle bir OTA güncellemesi uygulandıktan hemen sonra başlatma işlemi için çok önemlidir. Bu nedenle, first_stage_init
bağlamadan önce meta veri bölümü kontrol edilmelidir. Bunun gerçekleşmesini sağlamak için check
fs_mgr işaretini /metadata
girişine ekleyin. Aşağıda bir örnek verilmiştir:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Çekirdek gereksinimleri
Anlık görüntü almayı etkinleştirmek için CONFIG_DM_SNAPSHOT
değerini true
olarak ayarlayın.
F2FS kullanan cihazlarda, dosya sabitlemeyi düzeltmek için f2fs: export FS_NOCOW_FL flag to user çekirdek yamasını ekleyin. f2fs: support aligned pinned file çekirdek yamasını da ekleyin.
Sanal A/B, çekirdek sürümü 4.3'te eklenen özelliklerden yararlanır: snapshot
ve snapshot-merge
hedeflerindeki overflow durum biti. Android 9 ve sonraki sürümlerle kullanıma sunulan tüm cihazlarda çekirdek sürümü 4.4 veya sonraki bir sürüm yüklü olmalıdır.
Sıkıştırılmış anlık görüntüleri etkinleştirmek için desteklenen minimum çekirdek sürümü 4.19'dur.
CONFIG_DM_USER=m
veya CONFIG_DM_USER=y
olarak ayarlayın. Önceki yöntemi (modül) kullanıyorsanız modül, ilk aşama ramdisk'te yüklenmelidir. Bu, cihazın Makefile dosyasına aşağıdaki satır eklenerek yapılabilir:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Fastboot araçlarında yapılan değişiklikler
Android 11, fastboot protokolünde aşağıdaki değişiklikleri yapar:
getvar snapshot-update-status
: Önyükleme denetimi HAL'sinin önyükleyiciye ilettiği değeri döndürür:- Durum
MERGING
ise bootloadermerging
değerini döndürmelidir. - Durum
SNAPSHOTTED
ise bootloadersnapshotted
değerini döndürmelidir. - Aksi takdirde, bootloader
none
değerini döndürmelidir.
- Durum
snapshot-update merge
: Birleştirme işlemini tamamlar ve gerekirse kurtarma/fastbootd modunda başlatır. Bu komut yalnızcasnapshot-update-status
merging
ise geçerlidir ve yalnızca fastbootd'de desteklenir.snapshot-update cancel
: Önyükleme kontrolü HAL'inin birleştirme durumunuCANCELLED
olarak ayarlar. Bu komut, cihaz kilitliyken geçersizdir.erase
veyawipe
:metadata
,userdata
veyaerase
ya dawipe
birleştirme durumunu içeren bir bölüm, anlık görüntü birleştirme durumunu kontrol etmelidir. DurumMERGING
veyaSNAPSHOTTED
ise cihaz işlemi iptal etmelidir.set_active
: Etkin yuvanın değiştirildiği birset_active
komutu, anlık görüntü birleştirme durumunu kontrol etmelidir. DurumMERGING
ise cihaz işlemi iptal etmelidir. Yuva,SNAPSHOTTED
durumunda güvenli bir şekilde değiştirilebilir.
Bu değişiklikler, cihazın yanlışlıkla başlatılamaz hale gelmesini önlemek için tasarlanmıştır ancak otomatik araçları aksatabilir. Komutlar, fastboot flashall
komutunu çalıştırmak gibi tüm bölümleri flaşlamanın bir bileşeni olarak kullanıldığında aşağıdaki akışın kullanılması önerilir:
- Sorgu
getvar snapshot-update-status
. merging
veyasnapshotted
isesnapshot-update cancel
sorununu giderin.- Flaşlama adımlarıyla devam edin.
Depolama alanı gereksinimlerini azaltma
Süperde tam A/B depolama alanı ayrılmamış ve gerektiğinde /data
kullanmayı bekleyen cihazların blok eşleme aracını kullanması önemle tavsiye edilir. Blok eşleme aracı, blok ayırmayı derlemeler arasında tutarlı tutarak anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu durum, OTA Boyutunu Küçültme bölümünde belgelenmiştir.
OTA sıkıştırma algoritmaları
OTA paketleri, farklı performans metrikleri için ayarlanabilir. Android, yükleme süresi, COW alan kullanımı, önyükleme süresi ve anlık görüntü birleştirme süresi arasında denge sağlayan çeşitli desteklenen sıkıştırma yöntemleri (lz4
, zstd
ve none
) sunar. Sıkıştırma ile sanal ab için varsayılan olarak etkinleştirilen seçenek lz4
compression method
'dır.
Sıkıştırmada ince ayar
Sıkıştırma algoritmaları iki yöntemle daha fazla özelleştirilebilir: (sıkıştırma düzeyi) (hız pahasına elde edilen sıkıştırma miktarı) ve (sıkıştırma faktörü) (maksimum sıkıştırılabilir pencere boyutu).
Sıkıştırma düzeyi, zstd
gibi belirli algoritmalarda kullanılabilir ve düzeyi değiştirmek hız ile sıkıştırma oranı arasında bir denge kurmayı gerektirir.
Sıkıştırma faktörü, OTA yüklemesi sırasında kullanılan maksimum sıkıştırma penceresi boyutunu açıklar. Varsayılan değer 64k olarak ayarlanır ancak PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR
derleme parametresi özelleştirilerek geçersiz kılınabilir. 4k, 8k, 16k, 32k, 64k, 128k ve 256k sıkıştırma faktörleri desteklenir.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Pixel 8 Pro'da artımlı OTA
Yükleme sonrası aşaması olmadan yükleme süresi | COW Alanı Kullanımı | OTA sonrası önyükleme süresi | Anlık görüntü birleştirme zamanı | |
---|---|---|---|---|
lz4 | 18 dk. 15 sn. | 2,5 GB | 32,7 sn | 98,6 sn |
zstd | 24 dk. 49 sn. | 2,05 GB | 36,3 sn. | 133,2 sn. |
yok | 16 dk 42 sn | 4,76 GB | 28,7 sn. | 76,6 sn. |
Pixel 8 Pro'da tam OTA
Yükleme sonrası aşaması olmadan yükleme süresi | COW Alanı Kullanımı | OTA sonrası önyükleme süresi | Anlık görüntü birleştirme zamanı | |
---|---|---|---|---|
lz4 | 15 dk. 11 sn. | 4,16 GB | 17,6 sn | 82,2 sn. |
zstd | 16 dakika 19 saniye | 3,46 GB | 21,0 sn. | 106,3 sn. |
yok | 13 dk 33 sn | 6,39 GB | 18,5 sn. | 92,5 sn |