Wdróż wirtualne testy A/B

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,zstdlz4. 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.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

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 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ć wartość 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 kontroli uruchamiania powinna sprawdzać stan scalania migawek. Jeśli stan to MERGING lub SNAPSHOTTED, urządzenie powinno przerwać operację.
  • 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 wykonanie tych czynności:

  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 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, zstdnone), 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