Yeni bir cihaza sanal A/B uygulamak veya kullanıma sunulan bir cihazda geriye dönük düzenleme yapmak için cihaza özel kodda değişiklik yapması gerekir.
Derleme işaretleri
Sanal A/B kullanan cihazlar A/B olarak yapılandırılmalıdır. cihaz ve şununla başlatılmalıdır: dinamik bölümleri bulunur.
Sanal A/B ile başlatılan cihazları sanal A/B'yi devralacak şekilde ayarlayın cihaz tabanı yapılandırması:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Sanal A/B ile kullanıma sunulan cihazların, sanal A/B'nin
B alanları artık "süper"de olmadığı için BOARD_SUPER_PARTITION_SIZE
. Yani,
BOARD_SUPER_PARTITION_SIZE
, en az olmalıdır
sum(güncelleme gruplarının boyutu) + genel gider, bu da daha büyük olmalıdır.
topla(bölümlerin boyutu) + ek yük değerine eşit veya bu değerden küçük olmalıdır.
Android 13 ve sonraki sürümlerde sıkıştırmayı etkinleştirmek için anlık görüntüler için aşağıdaki temel yapılandırmayı devralır:
$(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şlemsiz bir işlem kullanırken sanal A/B ile kullanıcı alanı anlık görüntülerine olanak tanır
yöntemidir. Ardından, sıkıştırma yöntemini ayarlayarak
desteklenen yöntemler, gz
, zstd
ve lz4
.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
Android 12'de sıkıştırılmış anlık görüntüleri etkinleştirmek için Sanal A/B, aşağıdaki temel yapılandırmayı devralır:
$(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 geçen cihazlarda
XOR sıkıştırma özelliği
varsayılan olarak etkindir. XOR sıkıştırmayı etkinleştirmek için aşağıdakileri cihazın
.mk
dosyası yükleyin.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
Şunlardan devralan cihazlar için ÖZELVEYA sıkıştırması varsayılan olarak etkindir:
android_t_baseline.mk
Kullanıcı alanı birleştirme
Android 13 ve sonraki sürümlere geçen cihazlarda
Cihaz eşleştirici bölümünde açıklandığı gibi kullanıcı alanı birleştirme işlemi
katman oluşturma
varsayılandır. Kullanıcı alanı birleştirmeyi etkinleştirmek için aşağıdaki satırı cihazın .mk
bölümüne ekleyin
dosya:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Kullanıcı alanı birleştirme, 13 ve üzeri.
Başlatma kontrolü HAL'si
Başlatma kontrolü HAL OTA istemcilerinin önyükleme alanlarını kontrol etmesi için bir arayüz sağlar. Sanal A/B ek API'ler nedeniyle önyükleme denetimi HAL'sinin küçük bir sürümünün yükseltilmesini gerektirir yanıp sönme veya fabrika ayarlarına sıfırlama sırasında bootloader'ın korunduğundan emin olmak için gereklidir. Görüntüleyin IBootControl.hal ve types.hal sayfası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üğü, başlatma işlemi için çok önemlidir.
Özellikle bir OTA güncellemesi uygulandıktan hemen sonra. Bu nedenle, meta veri bölümünün
first_stage_init
tarafından monte edilmeden önce kontrol edilmelidir. Bunun olmasını sağlamak için
/metadata
girişine fs_mgr flag'i check
. Aşağıdaki özellikler,
örnek:
/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 cihazlar için f2fs: Export FS_NOCOW_FL flag'ini şuraya ekleyin: user çekirdek yamasını düzeltmesine yardımcı olur. f2fs: destek uyumlu sabitlenmiş dosyası çekirdek düzeltmesini de devre dışı bırakabilirsiniz.
Sanal A/B, çekirdek 4.3 sürümünde eklenen özelliklere dayanır: overflow
durum bitini snapshot
ve snapshot-merge
hedeflerinde gösterir. Tüm cihazlar başlatılıyor
.
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. Birincisini (modül) kullanıyorsanız
modülün birinci aşama ramdisk'e yüklenmesi gerekir. Bunu başarmak için ise
şu satırı cihazın Makefile'a ekleyerek:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Android 11'e geçen cihazlarda yenileme
Android 11'e yükseltildiğinde, dinamik bölümlerle kullanıma sunulan cihazlar isteğe bağlı olarak sanal A/B'de geriye dönük ayarlamalar yapabilirsiniz. Güncelleme işlemi genel olarak Sanal A/B ile başlatılan cihazlar (bazı küçük farklılıklar):
COW dosyalarının konumu: OTA istemcisi, başlatma cihazları için süper bölümlendirmede alan kullanmadan önce
/data
. Geliştirme amaçlı cihazlarda, süper güçte her zaman yeterli alan bölümünü kullanarak COW dosyası hiçbir zaman/data
üzerinde oluşturulmaz.Derleme zamanı özellik işaretleri: Sanal A/B'yi destekleyen cihazlar için hem
PRODUCT_VIRTUAL_AB_OTA
hem dePRODUCT_VIRTUAL_AB_OTA_RETROFIT
ayarlandıtrue
adlı alıcıya aşağıda gösterildiği gibi:(call inherit-product, \
(SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
Süper bölüm boyutu: Sanal A/B ile başlatılan cihazlar kesilebilir. B alanları süper'de olmadığı için
BOARD_SUPER_PARTITION_SIZE
yarıda bölüm. Sanal A/B'yi güçlendiren cihazlar eski süper bölümü korur yaniBOARD_SUPER_PARTITION_SIZE
, 2 * toplam(güncelleme gruplarının boyutu) + genel gider, bu da 2 * toplam(bölüm boyutu) + ek yük.
Bootloader değişiklikleri
Bir güncellemenin birleştirme adımı sırasında /data
,
Android OS. Taşıma işlemi başladığında system
, vendor
ve
Kopyalama işlemi tamamlanana kadar product
bölümleri tamamlanmayacak. Cihaz
kurtarma veya Sistemler aracılığıyla fabrika ayarlarına sıfırlama işlemi
cihaz yeniden başlatılamaz.
/data
öğesini silmeden önce, şuna bağlı olarak kurtarma veya geri alma işleminde birleştirme işlemini tamamlayın:
cihaz durumu:
- Yeni derleme daha önce başarıyla başlatıldıysa taşıma işlemini tamamlayın.
- Aksi takdirde, eski alana geri dönün:
- Dinamik bölümler için önceki duruma geri dönün.
- Statik bölümler için etkin alanı eski yuvaya ayarlayın.
Bootloader ve fastbootd
, aşağıdaki durumlarda /data
bölümünü silebilir
cihazın kilidi açıldığından. fastbootd
, taşıma işlemini tamamlanmaya zorlayabilir ancak
işlemi gerçekleştiremez. Bootloader, bir birleştirme işleminin tamamlanıp tamamlanmadığını
/data
ürününde hangi blokların OS bölümlerini oluşturduğunu görebilirsiniz. Cihazlar
kullanıcıyı tanımadan cihazı çalışır duruma getirmesini (tuğlamasını)
şunları yapabilirsiniz:
- Bootloader'ın ayarlanan değeri okuyabilmesi için başlatma kontrolü HAL'sini uygulayın
setSnapshotMergeStatus()
yöntemiyle gerçekleştirebilirsiniz. - Birleştirme durumu
MERGING
ise veya birleştirme durumuSNAPSHOTTED
ise ve alan yeni güncellenen alanla değiştikten sonra silme isteğinde bulunur.userdata
,metadata
veya birleştirme durumunu saklayan bölüm: reddedildi. - Kullanıcıların şu işlemleri yapabilmesi için
fastboot snapshot-update cancel
komutunu uygulayın: Bootloader'a bu koruma mekanizmasını atlamak istediklerini bildirir. - Tüm cihaz yanıp sönerken
fastboot snapshot-update cancel
hatası vermek için özel yanıp sönen araçları veya komut dosyalarını değiştirin. Bu işlem güvenlidir, çünkü cihazın tamamen yanıp sönmesi OTA'yı kaldırır. Araç bu komutu algılayabilirfastboot getvar snapshot-update-status
uygulayarak çalışma zamanında istenen performansı artırın. Bu komutu, hata koşullarının birbirinden ayırt edilmesine 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 aracı değişiklikleri
Android 11, fastboot'ta aşağıdaki değişiklikleri yapıyor protokol:
getvar snapshot-update-status
— Önyüklemenin değerini döndürür Bootloader'a iletilen HAL kontrolü:- 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/hızlı başlatma. Bu komut yalnızcasnapshot-update-status
,merging
şeklindedir ve yalnızca fastbootd'da desteklenir.snapshot-update cancel
— Başlatma denetimi HAL'sinin birleştirme durumunu şu şekilde ayarlar:CANCELLED
. Cihaz kilitliyken bu komut geçersiz olur.erase
veyawipe
—erase
veyawipe
/metadata
,userdata
veya HAL'nin kontrol etmesi gereken başlatma denetimi için birleştirme durumunu barındıran bir bölüm anlık görüntü birleştirme durumunu gösterir. DurumMERGING
veyaSNAPSHOTTED
ise cihazın işlemi iptal etmesi gerekir.set_active
— Etkin zaman aralığını değiştiren birset_active
komutu anlık görüntü birleştirme durumunu kontrol etmesi gerekir. DurumMERGING
ise cihazın işlemi iptal etmesi gerekir. Yuva,SNAPSHOTTED
durumu.
Bu değişiklikler, cihazın yanlışlıkla başlatılamaz duruma gelmesini önlemek için tasarlanmıştır.
ancak otomatik araçları aksatabilirler. Komutlar
tüm bölümlerin yanıp sönen bileşeni (fastboot flashall
çalıştırmak gibi)
şu akışı kullanmanız önerilir:
getvar snapshot-update-status
. sorgu.merging
veyasnapshotted
isesnapshot-update cancel
.- Yanıp sönen adımlarla devam edin.
Depolama alanı gereksinimlerini azaltın
"Süper" olarak ayrılmış tam A/B depolama alanına sahip olmayan ve beklenen cihazlar
/data
kullanmak için blok eşlemenin kullanılması önemle tavsiye edilir
aracını kullanın. Blok eşleme aracı, blok ayırmanın derlemeler arasında tutarlı olmasını sağlar.
anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu konu, Azaltma
OTA Boyutu.
OTA sıkıştırma yöntemleri
OTA paketleri, farklı performans metrikleri için ayarlanabilir. Android,
desteklenen çeşitli sıkıştırma yöntemleri (gz
, lz4
, zstd
ve none
)
yükleme süresi, COW alanı kullanımı, başlatma süresi ve anlık görüntü arasında denge vardır.
birleştirme zamanı. Sıkıştırılmış 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
CPU hızına ve depolama alanı işleme hızına bağlı olarak değişebilir.
cihaz üzerinde. Aşağıda oluşturulan tüm OTA paketlerinde PostYüklemeler devre dışıdır.
açılış süresini biraz yavaşlatır. Bir deponun toplam dinamik bölüm boyutu
sıkıştırmasız tam ota'nın değeri 4,81 GB'tır).
Pixel 6 Pro'da artımlı OTA
Yükleme sonrası aşama olmadan yükleme süresi | COW alan kullanımı | Yayın OTA başlatma süresi | Anlık görüntü birleştirme zamanı | |
---|---|---|---|---|
gz | 24 dk. | 1,18 GB | 40,2 sn | 45,5 sn |
lz4 | 13 dk. | 1,49 GB | 37,4 sn | 37,1 sn |
yok | 13 dk. | 2,90 GB | 37,6 sn | 40,7 sn |
Pixel 6 Pro'da tam OSA
Yükleme sonrası aşama olmadan yükleme süresi | COW Alan Kullanımı | Yayın OTA başlatma süresi | Anlık görüntü birleştirme zamanı | |
---|---|---|---|---|
gz | 23 dk. | 2,79 GB | 24,9 sn | 41,7 sn |
lz4 | 12 dk. | 3,46 GB | 20,0 sn | 25,3 sn |
yok | 10 dk. | 4,85 GB | 20,6 sn | 29,8 sn |