Testowanie tworzenia i przywracania kopii zapasowej

Na tej stronie dowiesz się, jak w przypadku Twojej aplikacji testować kopie zapasowe w chmurze i proces przenoszenia danych między urządzeniami. Ważne jest, aby testować je w każdej głównej wersji aplikacji, aby mieć pewność, że użytkownicy mogą nadal jej używać na nowym urządzeniu. Chociaż funkcje tworzenia kopii zapasowej i przenoszenia są podobne, występują między nimi istotne różnice w przypadku Androida 12 (poziom interfejsu API 31) i wyższych. W szczególności chodzi o to, że podczas przenoszenia obowiązuje znacznie większy limit rozmiaru danych wynoszący 2 GB niż w przypadku kopii zapasowej w chmurze (25 MB).

Z tego przewodnika dowiesz się, jak skutecznie przetestować tworzenie i przywracanie kopii zapasowej w chmurze oraz przenoszenie danych D2D w całym cyklu programowania.

Jak działa testowanie kopii zapasowych

W tej sekcji opisujemy różne elementy struktury tworzenia kopii zapasowych Androida i opisujemy ich interakcje z aplikacjami, które obsługują Automatyczną kopię zapasową i kopię zapasową par klucz-wartość. Na etapie tworzenia aplikacji większość wewnętrznych elementów platformy jest odwrócona, więc nie musisz znać tych informacji. Jednak w fazie testowania ważniejsza staje się znajomość tych pojęć.

Poniższy diagram przedstawia przepływ danych podczas tworzenia i przywracania kopii zapasowej w chmurze. Do celów testowych możesz wykorzystać to samo urządzenie do tworzenia i przywracania kopii zapasowych w chmurze.

Przepływ danych środowiska tworzenia kopii zapasowych

Poniższy diagram przedstawia przepływ danych podczas transferu D2D:

Przepływ danych w ramach struktury przenoszenia

W przeciwieństwie do testowania tworzenia i przywracania kopii zapasowych w chmurze testy D2D wymagają urządzenia źródłowego i docelowego, z którego będą kopiować dane.

Usługa menedżera kopii zapasowych to usługa systemowa Androida, która administruje i inicjuje operacje tworzenia i przywracania kopii zapasowych. Usługa jest dostępna przez interfejs API Backup Manager.

Podczas wykonywania operacji tworzenia kopii zapasowej usługa wysyła do aplikacji zapytanie o dane kopii zapasowej, a następnie przekazuje ją do zapasowego transportu, który następnie archiwizuje dane w chmurze. Podczas operacji przywracania usługa menedżera kopii zapasowych pobiera dane kopii zapasowej z transportu zapasowego i przywraca je na urządzenie. W przypadku transferu D2D usługa Backup Manager wysyła do aplikacji zapytanie o dane kopii zapasowej i przekazuje je bezpośrednio do usługi menedżera kopii zapasowych na nowym urządzeniu, która wczytuje ją do aplikacji.

Pliki zapasowe to komponenty Androida, które odpowiadają za przechowywanie i pobieranie danych aplikacji. Urządzenie z Androidem może nie obsługiwać żadnych transferów zapasowych, ale tylko jeden z nich może być oznaczony jako aktywny. Dostępne dane zapasowe różnią się w zależności od urządzenia ze względu na ustawienia niestandardowe wprowadzone przez producentów urządzeń i dostawców usług, ale większość urządzeń z obsługą Google Play udostępnia te opcje przesyłania:

  • GMS Transport: aktywne przesyłanie kopii zapasowych w chmurze na większości urządzeń, które wchodzą w skład Usług mobilnych Google. Ten transport przechowuje dane w usłudze Android Backup Service.
  • Transport D2D: ten transport jest używany w migracji D2D do przenoszenia danych bezpośrednio z jednego urządzenia na drugie.

Narzędzia

Aby przetestować operacje tworzenia i przywracania kopii zapasowych, musisz dowiedzieć się czegoś o następujących narzędziach.

  • adb: umożliwia uruchamianie poleceń na urządzeniu lub w emulatorze.
  • bmgr: umożliwia wykonywanie różnych operacji tworzenia kopii zapasowych i przywracania danych.
  • logcat: aby wyświetlić dane wyjściowe operacji tworzenia kopii zapasowych i przywracania.

Testowanie kopii zapasowej w chmurze

Wykonując czynności opisane w tej sekcji, można tworzyć i przywracać kopie zapasowe w chmurze na jednym urządzeniu.

Przygotowywanie urządzenia lub emulatora do tworzenia kopii zapasowych w chmurze

Przygotuj urządzenie lub emulator do testowania kopii zapasowej, korzystając z tej listy kontrolnej:

  1. W przypadku Automatycznej kopii zapasowej sprawdź, czy używasz urządzenia lub emulatora z Androidem 6.0 (poziom interfejsu API 23) lub nowszym.
  2. W przypadku tworzenia kopii zapasowych par klucz-wartość sprawdź, czy używasz urządzenia lub emulatora z Androidem 2.2 (poziom interfejsu API 8) lub nowszym.
  3. Aby przetestować kopię zapasową w chmurze, musisz mieć dostęp do internetu.
  4. Zaloguj się na urządzeniu za pomocą konta Google i ustaw je jako konto kopii zapasowej w Ustawienia -> Google -> Kopia zapasowa.

Aby przetestować kopię zapasową w chmurze, aktywuj kopię zapasową w chmurze, a następnie odinstaluj i ponownie zainstaluj aplikację. Aby te czynności były powtarzalne, możesz użyć tego skryptu: test_cloud_backup.sh, który tworzy kopię zapasową aplikacji, pobiera lokalnie plik APK, odinstaluje go i ponownie instaluje:

#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell bmgr transport com.android.localtransport/.LocalTransport | grep -q "Selected transport" || (echo "Error: error selecting local transport"; exit 1)
adb shell settings put secure backup_local_transport_parameters 'is_encrypted=true'
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

Etapy testu

  1. Otwórz aplikację, zaloguj się i zmodyfikuj wszystkie ustawienia.
  2. Uruchom skrypt, podając nazwę pakietu, np. test_cloud_backup.sh com.example.myapp
  3. Otwórz ponownie aplikację i sprawdź, czy działa prawidłowo, a wszystkie dane są zachowane.

Nie chcesz, aby użytkownicy musieli się logować, a wszystkie ich ustawienia, postępy i dane aplikacji muszą pozostawać bez zmian. Jeśli wyniki testu nie spełniają tych kryteriów, sprawdź, czy kopie zapasowe są skonfigurowane poprawnie, bez pomijania najważniejszych danych i że będziesz odtwarzać wszystkie dane z pamięci podręcznej, które zostały wykluczone z kopii zapasowej. Powtórz kroki 1–3 dla każdej iteracji testu.

Testowanie transferu D2D

Najprostszym sposobem przetestowania transferu D2D jest przeniesienie całej zawartości telefonu na nowe urządzenie, na którym przywrócono ustawienia fabryczne, i sprawdzenie, czy działa ono prawidłowo. Może to być jednak niewygodne i czasochłonne, jeśli trzeba będzie powtarzać ten proces wielokrotnie. Z tego artykułu dowiesz się, jak przeprowadzić symulację przenoszenia na jednym urządzeniu bez ciągłego przywracania ustawień fabrycznych.

Przygotuj urządzenie do testów D2D

Aby przetestować przenoszenie D2D na jednym urządzeniu, przygotuj je w ten sposób:

  1. Na urządzeniu musi być zainstalowany Android 12 (poziom interfejsu API 31) lub nowszy.
  2. Aby przetestować najnowszą wersję D2D, ustaw w aplikacji kierowanie na Androida 12 (poziom interfejsu API 31) lub nowszy.
  3. Utwórz następujący skrypt (test_d2d.sh), aby umożliwić powtarzanie testu:
#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell settings put secure backup_enable_d2d_test_mode 1
adb shell bmgr transport com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr list transports | grep -q -F "  * com.google.android.gms/.backup.migrate.service.D2dTransport" || (echo "Failed to select and initialize backup transport"; exit 1)
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell settings put secure backup_enable_d2d_test_mode 0
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

Etapy testu

  1. Zainstaluj na urządzeniu aplikację, którą chcesz przetestować.
  2. Otwórz aplikację, zaloguj się i zmodyfikuj jej ustawienia.
  3. Uruchom skrypt na urządzeniu, podając nazwę pakietu, np. test_d2d.sh com.example.myapp.
  4. Gdy skrypt będzie gotowy, otwórz aplikację na urządzeniu i sprawdź, czy działa prawidłowo. Wszystkie dane są zachowane.

Nie chcesz, aby użytkownicy musieli się logować, a wszystkie ich ustawienia, postępy i dane aplikacji muszą być wyświetlane w taki sam sposób jak przed uruchomieniem skryptu. Jeśli wyniki testu nie spełniają tych kryteriów, sprawdź, czy przesyłanie zostało prawidłowo skonfigurowane, bez pomijania kluczowych danych oraz że odtwarzasz z pamięci podręcznej dane, które zostały wykluczone z przenoszenia. Powtórz kroki 2–4 dla każdej iteracji testu.

Rozwiązywanie problemów z tworzeniem i przywracaniem kopii zapasowych

Ta sekcja pomoże Ci rozwiązać niektóre typowe problemy.

Przekroczono limit transportu

Poniższe komunikaty w narzędziu Logcat wskazują, że aplikacja przekroczyła limit transportowy:

I/PFTBT: Transport rejected backup of <PACKAGE>, skipping

--- or ---

I/PFTBT: Transport quota exceeded for package: <PACKAGE>

Zmniejsz ilość danych kopii zapasowej i spróbuj ponownie. Sprawdź na przykład, czy buforujesz dane tylko w katalogu pamięci podręcznej aplikacji. Katalog pamięci podręcznej nie jest uwzględniany w kopiach zapasowych.

Nie można utworzyć pełnej kopii zapasowej

Komunikat w aplikacji Logcat oznacza, że operacja tworzenia pełnej kopii zapasowej nie powiodła się, ponieważ na urządzeniu nie została jeszcze wykonana żadna operacja tworzenia kopii zapasowej w postaci par klucz-wartość:

I/BackupManagerService: Full backup not currently possible -- key/value backup
not yet run?

Uruchom kopię zapasową pary klucz-wartość poleceniem bmgr run, a potem spróbuj jeszcze raz.

Upłynął limit czasu oczekiwania na agenta

Ten komunikat w narzędziu Logcat oznacza, że uruchomienie aplikacji zajmuje ponad 10 sekund:

12-05 18:59:02.033  1910  2251 D BackupManagerService:
    awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Can't find backup agent for com.your.app.package

Zwróć uwagę na różnicę w sygnaturach czasowych w danych wyjściowych logu. Ten błąd występuje zwykle wtedy, gdy aplikacja korzysta z konfiguracji multidex bez ProGuard.

Niezainicjowane konto kopii zapasowej

Poniższe komunikaty w narzędziu Logcat wskazują, że kopia zapasowa została wstrzymana, ponieważ zapasowy zbiór danych nie został zainicjowany:

01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for
an uninitialized backup account.
01-31 14:32:45.699  1043 18255 W PFTBT: Transport failed; aborting backup: -1001
01-31 14:32:45.699  1043 18255 I PFTBT: Full backup completed with status: -1000

Uruchom menedżera kopii zapasowych za pomocą polecenia adb shell bmgr run, a następnie spróbuj ponownie wykonać kopię zapasową.

Niewywołane metody aplikacji

Automatyczna kopia zapasowa uruchamia Twoją aplikację z klasą podstawową Application, dlatego metody konfiguracji aplikacji mogą nie być wywoływane. Automatyczna kopia zapasowa nie uruchamia też żadnych aktywności w aplikacji, więc jeśli aplikacja przeprowadza konfigurację aktywności, możesz zobaczyć błędy. Więcej informacji znajdziesz w artykule o implementowaniu agenta kopii zapasowej.

Natomiast kopia zapasowa par klucz-wartość uruchamia aplikację z dowolną podklasą Application zadeklarowaną w pliku manifestu aplikacji.

Brak danych do utworzenia kopii zapasowej

Następujące komunikaty w usłudze Logcat wskazują, że aplikacja nie ma danych, których kopię zapasową można utworzyć:

I Backup  : [FullBackupSession] Package com.your.app.package doesn't have any backup data.

--- or ---

I Backup  : [D2dTransport] Package com.your.app.package doesn't have any backup data.

Jeśli wdrożysz własną metodę BackupAgent, prawdopodobnie oznacza to, że do kopii zapasowej nie zostały dodane żadne dane ani pliki.