Sanal A/B'yi yeni bir cihaza uygulamak veya başlatılan bir cihazı yenilemek için cihaza özel kodda değişiklikler yapmanız gerekir.
Bayraklar oluşturun
Sanal A/B kullanan cihazlar , bir A/B cihazı olarak yapılandırılmalı ve dinamik bölümlerle başlatılmalıdır .
Sanal A/B ile başlatılan cihazlar için, bunları sanal A/B cihazı temel yapılandırmasını devralacak şekilde ayarlayın:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Sanal A/B ile başlayan aygıtlar, BOARD_SUPER_PARTITION_SIZE
için yalnızca yarısı kadar pano boyutuna ihtiyaç duyar çünkü B yuvaları artık süper değildir. Diğer bir deyişle, BOARD_SUPER_PARTITION_SIZE
, sum(size of update group) + ek yükten büyük veya eşit olmalıdır; bu da, sırasıyla sum(size of partitions) + ek yükten büyük veya eşit olmalıdır.
Android 13 ve üzeri 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/android_t_baseline.mk)
Bu, işlem gerektirmeyen bir sıkıştırma yöntemi kullanırken Sanal A/B ile kullanıcı alanı anlık görüntülerini etkinleştirir. Daha sonra sıkıştırma yöntemini desteklenen yöntemlerden biri olan gz
ve brotli
olarak yapılandırabilirsiniz.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := gz
Android 12 için Virtual A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek üzere 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ükseltme yapan cihazlarda, XOR sıkıştırma özelliği varsayılan olarak etkin değildir. XOR sıkıştırmasını etkinleştirmek için, cihazın .mk
dosyasına aşağıdakini ekleyin.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
XOR sıkıştırması, android_t_baseline.mk
öğesinden devralan aygıtlar için varsayılan olarak etkindir.
Kullanıcı alanı birleştirme
Android 13 ve sonraki sürümlere yükseltme yapan cihazlarda, Cihaz eşleyici katmanlama bölümünde açıklanan kullanıcı alanı birleştirme işlemi varsayılan olarak etkin değildir. Kullanıcı alanı birleştirmeyi etkinleştirmek için, cihazın .mk
dosyasına aşağıdaki satırı ekleyin:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Kullanıcı alanı birleştirme, 13 ve üzeri sürümlerle başlayan cihazlarda varsayılan olarak etkindir.
Önyükleme denetimi HAL
Önyükleme denetimi HAL, OTA istemcilerinin önyükleme yuvalarını denetlemesi için bir arabirim sağlar. Sanal A/B, önyükleme denetimi HAL'ının küçük bir sürüm yükseltmesini gerektirir çünkü yanıp sönme/fabrika ayarlarına sıfırlama sırasında önyükleyicinin korunmasını sağlamak için ek API'ler gerekir. HAL tanımının en son sürümü için IBootControl.hal ve type.hal'a 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, önyükleme işlemi için çok önemlidir. Bu nedenle, meta veri bölümü, first_stage_init
onu bağlamadan önce kontrol edilmelidir. Bunun olmasını sağlamak için, girişe fs_mgr işaretini check
edin /metadata
. Aşağıdaki örnek bir örnek sağlar:
/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
true
olarak ayarlayın.
F2FS kullanan aygıtlar için, dosya sabitlemeyi düzeltmek için f2fs: export FS_NOCOW_FL bayrağını kullanıcı çekirdeği yamasına ekleyin. F2fs: Hizalanmış sabitlenmiş dosya çekirdeği yamasını da destekleyin .
Sanal A/B, çekirdek sürüm 4.3'te eklenen özelliklere dayanır: snapshot
taşma durumu biti ve snapshot-merge
hedefleri. Android 9 ve sonraki sürümlerle başlayan tüm cihazlarda çekirdek sürümü 4.4 veya sonraki sürümlere sahip 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
ayarlayın. İlki (bir modül) kullanılıyorsa, modül birinci aşama ramdisk'e yüklenmelidir. Bu, Makefile aygıtına aşağıdaki satırı ekleyerek elde edilebilir:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Android 11'e yükseltilen cihazlarda güçlendirme
Android 11'e yükseltirken, dinamik bölümlerle başlatılan cihazlar isteğe bağlı olarak sanal A/B'yi güçlendirebilir. Güncelleme işlemi, bazı küçük farklılıklar dışında, çoğunlukla sanal A/B ile başlatılan cihazlarla aynıdır:
COW dosyalarının konumu — Başlatma aygıtları için, OTA istemcisi
/data
içindeki alanı kullanmadan önce süper bölümdeki tüm kullanılabilir boş alanı kullanır. Güçlendirme aygıtları için, süper bölümde her zaman yeterli alan vardır, böylece COW dosyası hiçbir zaman/data
üzerinde oluşturulmaz.Yapı zamanı özellik bayrakları — Sanal A/B'yi güçlendiren cihazlar için, aşağıda gösterildiği gibi hem
PRODUCT_VIRTUAL_AB_OTA
hem dePRODUCT_VIRTUAL_AB_OTA_RETROFIT
true
olarak ayarlanmıştır:(call inherit-product, \
(SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
Süper bölüm boyutu — Sanal A/B ile başlayan aygıtlar,
BOARD_SUPER_PARTITION_SIZE
yarıya indirebilir çünkü B yuvaları süper bölümde değildir. Sanal A/B'yi güçlendiren aygıtlar eski süper bölüm boyutunu korur, bu nedenleBOARD_SUPER_PARTITION_SIZE
2 * sum(size of update group) + ek yükten büyük veya eşittir ve bu da 2 * sum(size of partitions) değerinden büyük veya eşittir + ek yük .
Önyükleyici değişiklikleri
Bir güncellemenin birleştirme adımı sırasında /data
, Android işletim sisteminin tek tam örneğini tutar. Geçiş başladığında, yerel system
, vendor
ve product
bölümleri, kopyalama tamamlanana kadar eksik kalır. Cihaz bu işlem sırasında kurtarma veya Sistem ayarları iletişim kutusu yoluyla fabrika ayarlarına sıfırlanırsa, cihaz yeniden başlatılamaz.
/data
öğesini silmeden önce, cihazın durumuna bağlı olarak kurtarma veya geri alma sırasında birleştirmeyi bitirin:
- Yeni yapı daha önce başarıyla önyüklendiyse geçişi tamamlayın.
- Aksi takdirde, eski yuvaya geri alma:
- Dinamik bölümler için önceki duruma geri dönün.
- Statik bölümler için, aktif yuvayı eski yuvaya ayarlayın.
Cihazın kilidi açılmışsa, hem önyükleyici hem de fastbootd
/data
bölümünü silebilir. fastbootd
taşıma işlemini tamamlamaya zorlayabilirken önyükleyici bunu yapamaz. Önyükleyici, bir birleştirmenin devam edip etmediğini veya /data
hangi blokların işletim sistemi bölümlerini oluşturduğunu bilmez. Cihazlar, kullanıcının aşağıdakileri yaparak cihazı bilmeden cihazı çalışmaz hale getirmesini (tuğlalama) önlemelidir:
- Önyükleyicinin
setSnapshotMergeStatus()
yöntemi tarafından ayarlanan değeri okuyabilmesi için önyükleme denetimi HAL'ını uygulayın. - Birleştirme durumu
MERGING
ise veya birleştirme durumuSNAPSHOTTED
ise ve yuva yeni güncellenen yuva olarak değiştiyse,userdata
,metadata
veya birleştirme durumunu depolayan bölümü silme istekleri önyükleyicide reddedilmelidir. -
fastboot snapshot-update cancel
komutunu uygulayın, böylece kullanıcılar önyükleyiciye bu koruma mekanizmasını atlamak istediklerini bildirebilirler. - Tüm cihazın yanıp sönmesi sırasında
fastboot snapshot-update cancel
vermek için özel yanıp sönme araçlarını veya komut dosyalarını değiştirin. Tüm cihazın yanıp sönmesi OTA'yı kaldırdığı için bunu yapmak güvenlidir. Tooling, bu komutu çalışma zamanındafastboot getvar snapshot-update-status
uygulayarak algılayabilir. Bu komut, hata koşulları arasında ayrım yapmaya yardımcı olur.
Örnek
struct VirtualAbState {
uint8_t StructVersion;
uint8_t MergeStatus;
uint8_t SourceSlot;
};
bool ShouldPreventUserdataWipe() {
VirtualAbState state;
if (!ReadVirtualAbState(&state)) ...
return state.MergeStatus == MergeStatus::MERGING ||
(state.MergeStatus == MergeStatus::SNAPSHOTTED &&
state.SourceSlot != CurrentSlot()));
}
Fastboot takım değişiklikleri
Android 11, fastboot protokolünde aşağıdaki değişiklikleri yapar:
-
getvar snapshot-update-status
— Önyükleme denetimi HAL'nin önyükleyiciye ilettiği değeri döndürür:- Durum
MERGING
ise, önyükleyicininmerging
döndürmesi gerekir. - Durum
SNAPSHOTTED
ise, önyükleyicisnapshotted
dönmelidir. - Aksi takdirde, önyükleyicinin
none
döndürmesi gerekir.
- Durum
-
snapshot-update merge
— Bir birleştirme işlemini tamamlar, gerekirse kurtarma/hızlı başlatmaya önyükleme yapar. Bu komut yalnızcasnapshot-update-status
merging
geçerlidir ve yalnızca fastbootd'da desteklenir. -
snapshot-update cancel
— Önyükleme denetimi HAL'nin birleştirme durumunuCANCELLED
olarak ayarlar. Cihaz kilitliyken bu komut geçersizdir. -
erase
veyawipe
—metadata
,userdata
veya önyükleme kontrolü HAL için birleştirme durumunu tutan bir bölümünerase
veyawipe
anlık görüntü birleştirme durumunu kontrol etmelidir. DurumMERGING
veyaSNAPSHOTTED
ise, cihaz işlemi iptal etmelidir. -
set_active
— Etkin alanı değiştiren birset_active
komutu, anlık görüntü birleştirme durumunu kontrol etmelidir. DurumMERGING
ise, cihaz işlemi iptal etmelidir. Yuva,SNAPSHOTTED
durumunda güvenle değiştirilebilir.
Bu değişiklikler, yanlışlıkla bir aygıtı önyüklenemez hale getirmeyi önlemek için tasarlanmıştır, ancak otomatikleştirilmiş araçları bozabilirler. Komutlar fastboot flashall
çalıştırmak gibi tüm bölümleri yanıp sönmenin bir bileşeni olarak kullanıldığında, aşağıdaki akışın kullanılması önerilir:
-
getvar snapshot-update-status
sorgusu. -
merging
veyasnapshotted
durumunda,snapshot-update cancel
yayınlayın. - Yanıp sönen adımlarla devam edin.
Depolama gereksinimlerini azaltın
Süper olarak ayrılmış tam A/B depolama alanına sahip olmayan ve /data
gerektiği gibi kullanmayı bekleyen cihazların blok eşleme aracını kullanmaları şiddetle tavsiye edilir. Blok eşleme aracı, yapılar arasında blok tahsisinin tutarlı olmasını sağlayarak anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu , OTA Boyutunu Küçültme altında belgelenmiştir.
OTA sıkıştırma yöntemleri
Ota paketleri, farklı performans ölçümleri için ayarlanabilir. Android şu anda yükleme süresi, COW alanı kullanımı, önyükleme süresi ve anlık görüntü birleştirme süresi arasında değiş tokuş yapan birkaç desteklenen sıkıştırma yöntemi ( gz
, lz4
ve none
) sağlamaktadır. Sıkıştırmalı sanal ab için etkinleştirilen varsayılan seçenek gz compression method
. (Not: Sıkıştırma yöntemleri arasındaki göreli performans, cihaza bağlı olarak değişebilen CPU hızına ve depolama verimine bağlı olarak değişir. Aşağıda oluşturulan tüm OTA paketleri, önyükleme süresini biraz yavaşlatacak olan PostInstall devre dışıdır. Tam bir ota'nın toplam dinamik bölüm boyutu sıkıştırma olmadan 4.81 GB ).
Pixel 6 Pro'da Artımlı OTA
Yükleme sonrası aşaması olmadan yükleme süresi | İNEK alan kullanımı | OTA önyükleme süresi sonrası | Anlık görüntü birleştirme zamanı | |
---|---|---|---|---|
gz | 24 dakika | 1,18 GB | 40.2 saniye | 45.5 saniye |
lz4 | 13 dakika | 1,49 GB | 37.4 saniye | 37.1 saniye |
hiçbiri | 13 dakika | 2,90 GB | 37.6 saniye | 40.7 saniye |
Pixel 6 Pro'da Tam OTA
Yükleme sonrası aşaması olmadan yükleme süresi | İNEK Alanı Kullanımı | OTA önyükleme süresi sonrası | Anlık görüntü birleştirme zamanı | |
---|---|---|---|---|
gz | 23 dakika | 2,79 GB | 24.9 saniye | 41.7 saniye |
lz4 | 12 dakika | 3,46 GB | 20.0 saniye | 25.3 saniye |
hiçbiri | 10 dk | 4,85 GB | 20.6 saniye | 29.8 saniye |