Sanal A/B'yi yeni bir cihaza uygulamak veya başlatılan bir cihazı güçlendirmek için cihaza özel kodda değişiklik yapmanız gerekir.
Bayraklar oluşturun
Sanal A/B kullanan aygıtlar, bir A/B aygıtı 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 tabanı yapılandırmasını devralacak şekilde ayarlayın:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Sanal A/B ile başlatılan cihazların BOARD_SUPER_PARTITION_SIZE
için yalnızca yarısı kadar kart boyutu gerekir çünkü B yuvaları artık süper durumda değildir. Yani, BOARD_SUPER_PARTITION_SIZE
toplamı(güncelleme gruplarının boyutu) + ek yükünden büyük veya eşit olmalıdır, bu da sırayla toplam(bölümlerin boyutu) + ek yükten büyük veya eşit olmalıdır.
Sanal A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek için bunun yerine aşağıdaki temel yapılandırmayı devralın:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
Ö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ükleyicinin yanıp sönme/fabrika ayarlarına sıfırlama sırasında korunmasını sağlamak için ek API'ler gerektiğinden, önyükleme denetimi HAL'nin küçük bir sürüm yükseltmesini gerektirir. HAL tanımının en son sürümü için IBootControl.hal ve type.hal'e 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);
}
tutucu3 l10n-yer// 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, /metadata
girdisine check
fs_mgr bayrağını ekleyin. Aşağıdakiler 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 f2fs'yi ekleyin: dosya sabitlemeyi düzeltmek için FS_NOCOW_FL bayrağını kullanıcı çekirdek düzeltme ekine aktarın. f2fs: hizalanmış sabitlenmiş dosya çekirdeği yamasını da dahil edin.
Sanal A/B, çekirdek sürüm 4.3'te eklenen özelliklere dayanır: snapshot
ve snapshot-merge
hedeflerindeki taşma durumu biti. Android 9 ve sonraki sürümleriyle başlatılan tüm cihazlarda zaten çekirdek sürümü 4.4 veya üstü 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 cihazına aşağıdaki satırı ekleyerek başarılabilir:
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, sanal A/B ile başlatılan cihazlarla çoğunlukla aynıdır:
COW dosyalarının konumu — Başlatma cihazları 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 cihazları için, süper bölümde her zaman COW dosyasının/data
üzerinde oluşturulmaması için yeterli alan vardır.Derleme zamanı özellik bayrakları — Sanal A/B'yi güçlendiren cihazlar için hem
PRODUCT_VIRTUAL_AB_OTA
hem dePRODUCT_VIRTUAL_AB_OTA_RETROFIT
aşağıda gösterildiği gibitrue
olarak ayarlanır:(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, B yuvaları süper bölümde olmadığı için
BOARD_SUPER_PARTITION_SIZE
yarıya indirebilir. Sanal A/B'yi güçlendiren cihazlar eski süper bölüm boyutunu korur, bu nedenleBOARD_SUPER_PARTITION_SIZE
2 * toplam(güncelleme gruplarının boyutu) + ek yükten büyük veya eşittir, bu da 2 * toplam(bölümlerin boyutu) veya daha büyük + tepegöz .
Önyükleyici değişiklikleri
Bir güncellemenin birleştirme adımı sırasında /data
, Android işletim sisteminin tek tüm örneğini tutar. Taşıma başladığında, yerel system
, vendor
ve product
bölümleri kopyalama tamamlanana kadar eksik kalır. Bu işlem sırasında cihaz, kurtarma yoluyla veya Sistem ayarları iletişim kutusu aracılığıyla fabrika ayarlarına sıfırlanırsa, cihaz başlatılamaz hale gelir.
/data
dosyasını silmeden önce, cihaz durumuna bağlı olarak kurtarma veya geri alma sırasında birleştirmeyi tamamlayın:
- Yeni yapı daha önce başarıyla önyüklendiyse, geçişi tamamlayın.
- Aksi takdirde, eski yuvaya geri dönün:
- 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çıksa, hem bootloader hem de fastbootd
/data
bölümünü silebilir. fastbootd
, geçişi tamamlamaya zorlayabilirken, önyükleyici yapamaz. Önyükleyici, bir birleştirmenin devam edip etmediğini veya /data
içindeki hangi blokların işletim sistemi bölümlerini oluşturduğunu bilmiyor. Cihazlar, aşağıdakileri yaparak kullanıcının bilmeden cihazı çalışmaz hale getirmesini (tuğlalama) önlemelidir:
- Önyükleyicinin
setSnapshotMergeStatus()
yöntemi tarafından ayarlanan değeri okuyabilmesi için HAL önyükleme denetimi uygulayın. - Birleştirme durumu
MERGING
ise veya birleştirme durumuSNAPSHOTTED
ise ve yuva yeni güncellenen yuvaya değiştiyse,userdata
verilerini,metadata
veya birleştirme durumunu depolayan bölümü silme istekleri önyükleyicide reddedilmelidir. - Kullanıcıların bu koruma mekanizmasını atlamak istediklerini önyükleyiciye bildirebilmeleri için
fastboot snapshot-update cancel
komutunu uygulayın. - Tüm cihaz yanıp sönerken
fastboot snapshot-update cancel
sağlamak için özel yanıp sönme araçlarını veya komut dosyalarını değiştirin. Bu, cihazın tamamının yanıp sönmesi OTA'yı kaldıracağı için güvenlidir. Araçlar,fastboot getvar snapshot-update-status
uygulayarak bu komutu çalışma zamanında algılayabilir. Bu komut, hata koşulları arasında ayrım yapılmasına yardımcı olur.
Örnek vermek
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ükleyicimerging
dönmelidir. - Durum
SNAPSHOTTED
ise, önyükleyicisnapshotted
döndürmelidir. - Aksi takdirde, önyükleyici
none
döndürmemelidir.
- Durum
-
snapshot-update merge
— Bir birleştirme işlemini tamamlar, gerekirse kurtarma/fastbootd'a ö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'ın birleştirme durumunuCANCELLED
olarak ayarlar. Cihaz kilitliyken bu komut geçersizdir. -
erase
veyawipe
— Önyükleme denetimi HAL için birleştirme durumunu tutanmetadata
,userdata
verilerinin veya 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 yuvayı değiştiren birset_active
komutu, anlık görüntü birleştirme durumunu kontrol etmelidir. DurumMERGING
ise, cihaz işlemi iptal etmelidir. Slot,SNAPSHOTTED
durumunda güvenle değiştirilebilir.
Bu değişiklikler, bir aygıtı yanlışlıkla önyüklenemez hale getirmeyi önlemek için tasarlanmıştır, ancak otomatik araçlar için yıkıcı olabilir. Komutlar, fastboot flashall
çalıştırılması gibi tüm bölümlerin yanıp sönmesinin bir bileşeni olarak kullanıldığında, aşağıdaki akışın kullanılması önerilir:
-
getvar snapshot-update-status
sorgusu. -
merging
veyasnapshotted
,snapshot-update cancel
. - Yanıp sönen adımlarla devam edin.
Depolama gereksinimlerinin azaltılması
Süper olarak ayrılmış tam A/B depolama alanına sahip olmayan ve gerektiğinde /data
kullanmayı bekleyen cihazların blok eşleme aracını kullanmaları şiddetle önerilir. Blok eşleme aracı, yapılar arasında blok ayırmayı tutarlı tutar ve anlık görüntüye gereksiz yazmaları azaltır. Bu, OTA Boyutunu Azaltma başlığı altında belgelenmiştir.