Wdrażanie testów A/B wirtualnych

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,zstdlz4. 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.haltypes.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 snapshotsnapshot-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.
  • snapshot-update merge – kończy operacje scalania, w razie potrzeby uruchamiając tryb odzyskiwania/szybkiego uruchamiania. To polecenie jest ważne tylko wtedy, gdy snapshot-update-status ma wartość merging. Jest ono obsługiwane tylko w trybie fastboot.
  • snapshot-update cancel – ustawia stan scalania interfejsu HAL sterowania uruchamianiem na CANCELLED. To polecenie jest nieprawidłowe, gdy urządzenie jest zablokowane.
  • erase lub wipe – erase lub wipemetadata, userdata lub partycja zawierająca stan scalania dla interfejsu HAL sterowania rozruchem powinna sprawdzać stan scalania migawek. Jeśli stan jest MERGING lub SNAPSHOTTED, urządzenie powinno przerwać działanie.
  • set_active – polecenie set_active, które zmienia aktywny slot, powinno sprawdzać stan łączenia migawek. Jeśli stan to MERGING, urządzenie powinno przerwać operację. Slot można bezpiecznie zmienić w stanie SNAPSHOTTED.

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:

  1. Zapytanie getvar snapshot-update-status.
  2. Jeśli merging lub snapshotted, wygeneruj zgłoszenie snapshot-update cancel.
  3. 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, zstdnone), 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