Aby wdrożyć test A/B na nowym urządzeniu lub dostosować już wprowadzone na rynek urządzenie, musisz wprowadzić zmiany w kodzie przeznaczonym dla danego 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ż dostępne w super. Oznacza to, że BOARD_SUPER_PARTITION_SIZE
musi być większa lub równa sumie(rozmiar grup aktualizacji) + overhead, która z kolei musi być większa lub równa sumie(rozmiar partycji) + overhead.
Aby w Androidzie 13 i nowszych włączyć skompresowane migawki z Virtual A/B, odziedź tę konfigurację podstawową:
$(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 za pomocą testu Virtual A/B przy użyciu metody kompresji bez operacji. 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 Dostrajanie kompresji.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Aby w Androidzie 12 włączyć skompresowane zrzuty ekranu 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 udostępnia 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
Integralność partycji metadanych jest niezbędna dla procesu uruchamiania, zwłaszcza tuż po zastosowaniu aktualizacji OTA. Dlatego przed zamontowaniem partycji metadanych przez first_stage_init
należy ją sprawdzić. Aby to zrobić, dodaj do wpisu /metadata
flagę fs_mgr o wartości check
. Przykład:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Wymagania dotyczące jądra
Aby włączyć tworzenie zrzutów, ustaw wartość parametru 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 wersji jądra 4.3: bitu 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ć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 sterowania rozruchem powinna sprawdzać stan scalania migawek. Jeśli stan jestMERGING
lubSNAPSHOTTED
, urządzenie powinno przerwać działanie.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 użycie tej procedury:
- 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 zapewnia spójność przydziału bloków między kompilacjami, co ogranicza niepotrzebne zapisy w zrzucie. Informacje na ten temat znajdziesz w sekcji Zmniejsz rozmiar OTA.
Algorytmy kompresji OTA
Pakiety OTA można dostosowywać do różnych wskaźników skuteczności. Android udostępnia kilka obsługiwanych metod kompresji (lz4
, zstd
i none
), które różnią się czasem instalacji, wykorzystaniem miejsca na COW, czasem uruchamiania i czasem łączenia migawek. Domyślną opcją włączoną w przypadku wirtualnego AB z kompresją jest 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
. Zmiana 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: 4 tys., 8 tys., 16 tys., 32 tys., 64 tys., 128 tys. i 256 tys.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Aktualizacje OTA na Pixelu 8 Pro
Czas instalacji bez fazy po instalacji | Korzystanie z przestrzeni COW | Czas uruchamiania po aktualizacji OTA | Czas scalania zrzutów | |
---|---|---|---|---|
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 42 s | 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 scalania zrzutów | |
---|---|---|---|---|
lz4 | 15 min 11 s | 4,16 GB | 17,6 s | 82,2 s |
zstd | 16 min 19 s | 3,46 GB | 21,0 s | 106,3 s |
brak | 13 min 33 s | 6,39 GB | 18,5 s | 92,5 s |