Aby wdrożyć funkcję wirtualnego A/B na nowym urządzeniu lub zastąpić już uruchomione urządzenie, musisz wprowadzić zmiany w kodzie dla konkretnego urządzenia.
Flagi kompilacji
Urządzenia korzystające z wirtualnego eksperymentu A/B muszą być skonfigurowane jako urządzenia A/B i mieć uruchomione dynamiczne partycje.
W przypadku urządzeń uruchamianych z wirtualnym A/B skonfiguruj je tak, aby dziedziczyły konfigurację podstawowego urządzenia z wirtualnym A/B:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Urządzenia uruchamiane z wirtualnym eksperymentem A/B potrzebują tylko połowy rozmiaru planszy dla
BOARD_SUPER_PARTITION_SIZE
, ponieważ sloty B nie są już w super. Oznacza to, że BOARD_SUPER_PARTITION_SIZE
musi być większa lub równa sumie rozmiarów grup aktualizacji, która z kolei musi być większa lub równa sumie rozmiarów partycji.
Aby w Androidzie 13 i nowszych wersjach włączyć skompresowane zrzuty ekranu z funkcją wirtualnego A/B, użyj tej konfiguracji podstawowej:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
Umożliwia to tworzenie zrzutów przestrzeni użytkownika z użyciem wirtualnego A/B przy użyciu metody niewymagającej kompresji. Następnie możesz skonfigurować metodę kompresji na jedną z obsługiwanych metod,zstd
i lz4
. W Androidzie 15 kompresję można dodatkowo dostosować do potrzeb urządzenia. Więcej informacji znajdziesz w artykule Dostosowywanie kompresji.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Aby w Androidzie 12 włączyć skompresowane zrzuty w ramach testu A/B wirtualnego, odziedź tę konfigurację podstawową:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
Kompresja XOR
W przypadku urządzeń, które są aktualizowane do Androida 13 lub nowszego, funkcja kompresji XOR nie jest domyślnie włączona. Aby włączyć kompresję XOR, dodaj te informacje do pliku .mk
urządzenia.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
Kompresja XOR jest domyślnie włączona na urządzeniach, które dziedziczą z android_t_baseline.mk
.
Scalanie przestrzeni użytkownika
W nowoczesnej wersji funkcji Virtual A/B (Android T i nowsze wersje) proces scalania migawek odbywa się całkowicie w przestrzeni użytkownika. Ta zmiana jest możliwa dzięki snapuserd i dm-user. Na urządzeniach z Androidem 13 lub nowszym złączenie przestrzeni użytkownika jest domyślnie włączone. W przypadku starszych urządzeń, które są aktualizowane, można ustawić tę właściwość za pomocą:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Interfejs HAL sterowania uruchamianiem
HAL kontroli rozruchu zapewnia interfejs dla klientów OTA do kontrolowania slotów rozruchu. Wirtualna funkcja A/B wymaga uaktualnienia do wersji małej interfejsu HAL kontroli rozruchu, ponieważ dodatkowe interfejsy API są potrzebne do zapewnienia ochrony bootloadera podczas flashowania lub resetowania do ustawień fabrycznych. Najnowszą wersję definicji HAL znajdziesz w plikach IBootControl.hal i types.hal.
// 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
}
Zmiany w pliku fstab
Nienaruszona integralność partycji metadanych jest niezbędna do prawidłowego działania procesu uruchamiania, zwłaszcza tuż po zastosowaniu aktualizacji OTA. Dlatego przed zamontowaniem partycji metadanych przez first_stage_init
należy ją sprawdzić. Aby tak się stało, dodaj do wpisu flagi /metadata
flagę fs_mgr check
. Przykład:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Wymagania jądra systemu
Aby włączyć tworzenie zrzutów, ustaw CONFIG_DM_SNAPSHOT
na true
.
W przypadku urządzeń korzystających z F2FS dodaj poprawkę do jądra f2fs: export FS_NOCOW_FL flag to user, aby naprawić przypinanie plików. Dołącz również poprawkę do jądra f2fs: support aligned pinned file.
Wirtualny test A/B korzysta z funkcji dodanych w jądrze w wersji 4.3: bit stanu przepełnienia w celu snapshot
i snapshot-merge
. Wszystkie urządzenia z Androidem 9 i nowszym powinny mieć jądro w wersji 4.4 lub nowszej.
Aby umożliwić tworzenie skompresowanych zrzutów, minimalna obsługiwana wersja jądra to 4.19.
Ustaw CONFIG_DM_USER=m
lub CONFIG_DM_USER=y
. Jeśli używasz pierwszego z nich (modułu), musisz go załadować na dysk RAM pierwszego poziomu. Aby to zrobić, dodaj ten wiersz do pliku Makefile urządzenia:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Zmiany w narzędziach Fastboot
Android 11 wprowadza następujące zmiany w protokole fastboot:
getvar snapshot-update-status
– zwraca wartość, którą interfejs HAL kontroli rozruchu przekazał do programatora:- Jeśli stan to
MERGING
, program rozruchowy musi zwrócić wartośćmerging
. - Jeśli stan to
SNAPSHOTTED
, program rozruchowy musi zwrócićsnapshotted
. - W przeciwnym razie program rozruchowy musi zwrócić wartość
none
.
- Jeśli stan to
snapshot-update merge
– kończy operacje scalania, w razie potrzeby uruchamiając tryb odzyskiwania/szybkiego uruchamiania. To polecenie jest ważne tylko wtedy, gdysnapshot-update-status
ma wartośćmerging
. Jest ono obsługiwane tylko w trybie fastboot.snapshot-update cancel
– ustawia stan scalania interfejsu HAL sterowania uruchamianiem naCANCELLED
. To polecenie jest nieprawidłowe, gdy urządzenie jest zablokowane.erase
lubwipe
–erase
lubwipe
zmetadata
,userdata
lub partycja zawierająca stan scalania dla interfejsu HAL kontroli uruchamiania powinna sprawdzać stan scalania migawek. Jeśli stan toMERGING
lubSNAPSHOTTED
, urządzenie powinno przerwać operację.set_active
– polecenieset_active
, które zmienia aktywny slot, powinno sprawdzać stan łączenia migawek. Jeśli stan toMERGING
, urządzenie powinno przerwać operację. Slot można bezpiecznie zmienić w stanieSNAPSHOTTED
.
Te zmiany mają zapobiegać przypadkowemu uniemożliwieniu uruchomienia urządzenia, ale mogą zakłócać działanie narzędzi zautomatyzowanych. Gdy polecenia są używane jako element procesu flashowania wszystkich partycji, np. fastboot flashall
, zalecamy wykonanie tych czynności:
- Zapytanie
getvar snapshot-update-status
. - Jeśli
merging
lubsnapshotted
, wygeneruj zgłoszeniesnapshot-update cancel
. - Przejdź do instrukcji dotyczącej instalowania oprogramowania.
Zmniejsz wymagania dotyczące miejsca na dane
Zalecamy używanie narzędzia do mapowania bloków w przypadku urządzeń, które nie mają pełnego miejsca na dane A/B przypisanego w super i które mają zamiar używać /data
w razie potrzeby. Narzędzie do mapowania bloków dba o spójność przydziału bloków między kompilacjami, ograniczając zbędnych zapisów do zrzutu. Informacje na ten temat znajdziesz w sekcji Zmniejsz rozmiar OTA.
Algorytmy kompresji OTA
Pakiety OTA można dostosowywać pod kątem różnych wskaźników wydajności. Android udostępnia kilka obsługiwanych metod kompresji (lz4
, zstd
i none
), które mają swoje wady i zalety w zakresie czasu instalacji, wykorzystania miejsca na COW, czasu uruchamiania i czasu scalania migawek. Domyślna opcja włączona w przypadku wirtualnego ab z kompresją to lz4
compression method
.
Dostrajanie kompresji
Algorytmy kompresji można dostosowywać na 2 sposoby: (poziom kompresji) (ilość kompresji osiągnięta kosztem szybkości) i (współczynnik kompresji) (maksymalna wielkość skompresowanego okna).
Poziom kompresji jest dostępny w przypadku niektórych algorytmów, takich jak zstd
, a zmiana tego poziomu powoduje kompromis między szybkością a współczynnikiem kompresji.
Współczynnik kompresji określa maksymalny rozmiar okna kompresji używany podczas instalacji OTA. Domyślnie jest to 64 KB, ale można to zmienić, dostosowując parametr buildu PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR
. Obsługiwane współczynniki kompresji to 4 tys., 8 tys., 16 tys., 32 tys., 64 tys., 128 tys. i 256 tys.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Przyrostowa aktualizacja OTA na Pixelu 8 Pro
Czas instalacji bez fazy po instalacji | Korzystanie z przestrzeni COW | Czas uruchamiania po aktualizacji OTA | Czas scalenia zrzutu | |
---|---|---|---|---|
lz4 | 18 min 15 s | 2,5 GB | 32,7 s | 98,6 s |
zstd | 24 min 49 s | 2,05 GB | 36,3 s | 133,2 s |
brak | 16 min 42s | 4,76 GB | 28,7 s | 76,6 s |
Pełna aktualizacja OTA na Pixelu 8 Pro
Czas instalacji bez fazy po instalacji | Korzystanie z przestrzeni COW | Czas uruchamiania po aktualizacji OTA | Czas scalenia zrzutu | |
---|---|---|---|---|
lz4 | 15 min 11 s | 4,16 GB | 17,6 s | 82,2 s |
zstd | 16 min 19s | 3,46 GB | 21,0 s | 106,3 s |
brak | 13 min 33 s | 6,39 GB | 18,5 s | 92,5 s |