Sicherung und Wiederherstellung testen

Auf dieser Seite wird beschrieben, wie Sie die Cloud-Sicherungen und den D2D-Übertragungsprozess für Ihre App testen. Es ist wichtig, beide mit jedem Hauptrelease Ihrer App zu testen, damit Ihre Nutzer die App weiterhin auf einem neuen Gerät verwenden können. Obwohl sich sowohl die Sicherung als auch die Übertragung ähneln, gibt es wichtige Unterschiede zwischen den beiden in Android 12 (API-Level 31) und höher – insbesondere, dass für die Übertragung ein viel größeres Limit von 2 GB im Vergleich zu 25 MB für Cloud-Back-ups gilt.

In dieser Anleitung erfahren Sie, wie Sie sowohl die Cloud-Sicherung und -Wiederherstellung als auch die D2D-Übertragung während des gesamten Entwicklungszyklus effizient testen können.

Funktionsweise des Testens von Sicherungen

In diesem Abschnitt werden verschiedene Teile des Android Backup-Frameworks und deren Interaktion mit Apps beschrieben, die die automatische Sicherung und die Sicherung von Schlüssel/Wert-Paaren unterstützen. Während der App-Entwicklungsphase wird der Großteil der internen Funktionsweise des Frameworks abstrahiert, sodass Sie diese Informationen nicht kennen müssen. Während der Testphase ist es jedoch wichtiger, diese Konzepte zu verstehen.

Das folgende Diagramm zeigt, wie Daten bei der Sicherung und Wiederherstellung in der Cloud fließen. Zu Testzwecken kann dasselbe Gerät für die Cloud-Sicherung und -Wiederherstellung verwendet werden.

Datenfluss des Back-up-Frameworks

Das folgende Diagramm zeigt den Datenfluss bei einer D2D-Übertragung:

Transfer Framework-Datenfluss

Im Gegensatz zu Tests für das Sichern und Wiederherstellen in der Cloud benötigen D2D-Tests ein Quell- und ein Zielgerät, von dem und auf das kopiert werden kann.

Der Backup Manager Service ist ein Android-Systemdienst, der Sicherungs- und Wiederherstellungsvorgänge orchestriert und initiiert. Auf den Dienst kann über die Backup Manager API zugegriffen werden.

Während eines Sicherungsvorgangs fragt der Dienst Ihre Anwendung nach Sicherungsdaten ab und übergibt sie dann an den Sicherungstransport, der die Daten dann in der Cloud archiviert. Während einer Wiederherstellung ruft der Sicherungsmanager-Dienst die Sicherungsdaten aus dem Sicherungstransport ab und stellt sie auf dem Gerät wieder her. Bei einer D2D-Übertragung fragt der Backup Manager-Dienst Ihre App nach Sicherungsdaten ab und übergibt sie direkt an den Backup Manager-Dienst auf dem neuen Gerät, der die Daten dann in Ihre App lädt.

Sicherungstransporte sind Android-Komponenten, die für das Speichern und Abrufen Ihrer App-Daten verantwortlich sind. Ein Android-Gerät kann keinen oder mehrere Backup-Transsport haben, aber nur einer dieser Transporte kann als aktiv markiert werden. Die verfügbaren Sicherungsübertragungen unterscheiden sich aufgrund von Anpassungen durch Gerätehersteller und Dienstanbieter von Gerät zu Gerät. Die meisten Google Play-fähigen Geräte werden jedoch mit folgenden Transporten ausgeliefert:

  • GMS Transport: die aktive Cloud-Sicherungsübertragung auf den meisten Geräten, die Teil der Google Mobile-Dienste ist. Dabei werden Daten im Android Backup Service gespeichert.
  • D2D-Transport:Dieser Transport wird bei der D2D-Migration verwendet, um Daten direkt von einem Gerät auf ein anderes zu übertragen.

Tools

Wenn Sie Ihre Sicherungs- und Wiederherstellungsvorgänge testen möchten, müssen Sie etwas über die folgenden Tools wissen.

  • adb: zum Ausführen von Befehlen auf dem Gerät oder Emulator.
  • bmgr: zum Ausführen verschiedener Sicherungs- und Wiederherstellungsvorgänge
  • logcat: Zeigt die Ausgabe von Sicherungs- und Wiederherstellungsvorgängen an.

Cloud-Sicherung testen

Die Sicherung und Wiederherstellung in der Cloud kann mit einem einzelnen Gerät durchgeführt werden. Folgen Sie dazu den Schritten in diesem Abschnitt.

Gerät oder Emulator für Cloud-Sicherungen vorbereiten

Bereiten Sie Ihr Gerät oder Ihren Emulator für den Sicherungstest vor. Gehen Sie dazu die folgende Checkliste durch:

  1. Verwenden Sie für die automatische Sicherung ein Gerät oder einen Emulator mit Android 6.0 (API-Level 23) oder höher.
  2. Verwenden Sie für die Sicherung von Schlüssel/Wert-Paaren ein Gerät oder einen Emulator mit Android 2.2 (API-Level 8) oder höher.
  3. Sie benötigen Internetzugriff, um die Cloud-Sicherung zu testen.
  4. Melden Sie sich mit einem Google-Konto auf dem Gerät an und legen Sie es unter Einstellungen -> Google -> Sicherung als Sicherungskonto fest.

Lösen Sie zum Testen der Cloud-Sicherung ein Cloud-Back-up aus, deinstallieren Sie die App und installieren Sie sie anschließend neu. Damit diese Schritte wiederholbar sind, können Sie das folgende Skript test_cloud_backup.sh verwenden. Es sichert Ihre App, lädt das APK lokal herunter, deinstalliert es und installiert es neu:

#!/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"

Testschritte

  1. Öffne deine App, melde dich an und ändere alle Einstellungen.
  2. Führen Sie das Skript aus und übergeben Sie den Paketnamen, z. B. test_cloud_backup.sh com.example.myapp.
  3. Öffnen Sie die Anwendung noch einmal und prüfen Sie, ob sie ordnungsgemäß funktioniert und alle Daten beibehalten werden.

Sie möchten nicht, dass sich Ihre Nutzer anmelden müssen. Einstellungen, Fortschritt und App-Daten müssen unverändert sein. Wenn Ihre Testergebnisse diese Kriterien nicht erfüllen, prüfen Sie, ob Sie Sicherungen korrekt konfiguriert haben, ohne wichtige Daten auszulassen, und ob Sie auch die Wiederherstellung aller im Cache gespeicherten Daten übernehmen, die Sie aus der Sicherung ausgeschlossen haben. Wiederholen Sie die Schritte 1 bis 3 für jeden Testdurchlauf.

D2D-Übertragung testen

Die umfassendste Methode zum Testen der D2D-Übertragung besteht darin, den gesamten Inhalt Ihres Smartphones auf ein neues Gerät zu übertragen, das auf die Werkseinstellungen zurückgesetzt wurde, und zu prüfen, ob es richtig funktioniert. Dies kann jedoch zeitaufwändig sein, wenn Sie den Vorgang mehrmals wiederholen müssen. In diesen Schritten wird beschrieben, wie Sie eine Übertragung mit einem einzelnen Gerät simulieren, ohne das Gerät wiederholt auf die Werkseinstellungen zurückzusetzen.

Gerät für D2D-Tests vorbereiten

Bereiten Sie die D2D-Übertragung so vor, um die D2D-Übertragung auf einem einzelnen Gerät zu testen:

  1. Auf deinem Gerät muss Android 12 (API-Level 31) oder höher installiert sein.
  2. Wenn du die neueste Version von D2D testen möchtest, solltest du deine App auf Android 12 (API-Level 31) oder höher ausrichten.
  3. Erstellen Sie das folgende Skript (test_d2d.sh), um Wiederholungen des Tests zu unterstützen:
#!/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"

Testschritte

  1. Installieren Sie auf dem Gerät die App, die Sie testen möchten.
  2. Öffnen Sie Ihre App, melden Sie sich an und ändern Sie die Einstellungen der App.
  3. Führen Sie das Skript auf Ihrem Gerät aus und geben Sie dabei den Paketnamen an, z. B. test_d2d.sh com.example.myapp.
  4. Wenn das Skript abgeschlossen ist, öffnen Sie die App auf dem Gerät und prüfen Sie, ob sie richtig funktioniert und alle Daten beibehalten werden.

Sie möchten nicht, dass sich Ihre Nutzer anmelden müssen. Alle Einstellungen, Fortschritts- und App-Daten müssen wie vor der Ausführung des Skripts angezeigt werden. Wenn Ihre Testergebnisse diese Kriterien nicht erfüllen, prüfen Sie, ob Sie die Übertragung richtig konfiguriert haben, ohne wichtige Daten auszulassen. Außerdem müssen Sie die Wiederherstellung aller im Cache gespeicherten Daten übernehmen, die Sie von der Übertragung ausgeschlossen haben. Wiederholen Sie die Schritte 2 bis 4 für jeden Testdurchlauf.

Fehler beim Sichern und Wiederherstellen beheben

Dieser Abschnitt hilft Ihnen dabei, einige häufig auftretende Probleme zu beheben.

Transportkontingent überschritten

Die folgenden Meldungen in Logcat geben an, dass Ihre Anwendung das Transportkontingent überschritten hat:

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

--- or ---

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

Reduzieren Sie die Menge an Sicherungsdaten und versuchen Sie es noch einmal. Achten Sie beispielsweise darauf, dass Sie Daten nur im Cache-Verzeichnis Ihrer Anwendung im Cache speichern. Das Cache-Verzeichnis ist nicht in Sicherungen enthalten.

Vollständige Sicherung nicht möglich

Die folgende Meldung in Logcat zeigt an, dass die vollständige Sicherung fehlgeschlagen ist, da auf dem Gerät noch kein Vorgang zum Sichern von Schlüssel/Wert-Paaren durchgeführt wurde:

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

Lösen Sie mit dem Befehl bmgr run eine Schlüssel/Wert-Sicherung aus und versuchen Sie es dann noch einmal.

Zeitüberschreitung beim Warten auf den Agent

Die folgende Meldung in Logcat gibt an, dass der Start der Anwendung für die Sicherung mehr als 10 Sekunden dauert:

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

Beachten Sie den Zeitstempelunterschied in der Logausgabe. Dieser Fehler tritt in der Regel auf, wenn Ihre App eine Multidex-Konfiguration ohne ProGuard verwendet.

Nicht initialisiertes Sicherungskonto

Die folgenden Meldungen in Logcat geben an, dass die Sicherung angehalten wurde, weil das Sicherungs-Dataset nicht initialisiert wurde:

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

Führen Sie den Sicherungsmanager mit dem Befehl adb shell bmgr run aus und versuchen Sie dann noch einmal, die Sicherung auszuführen.

App-Methoden nicht aufgerufen

Da die automatische Sicherung Ihre Anwendung mit der Basisklasse Application startet, werden die Einrichtungsmethoden der Anwendung möglicherweise nicht aufgerufen. Die automatische Sicherung startet auch keine Aktivitäten Ihrer App. Wenn Ihre Anwendung in einer Aktivität eingerichtet wird, können daher Fehler auftreten. Weitere Informationen finden Sie unter BackupAgent implementieren.

Im Gegensatz dazu startet die Schlüssel/Wert-Sicherung Ihre App mit einer beliebigen Application-Unterklasse, die Sie in der Manifest-Datei Ihrer App deklarieren.

Keine Daten zum Sichern vorhanden

Die folgenden Meldungen in Logcat geben an, dass Ihre Anwendung keine Daten hat, die gesichert werden können:

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.

Wenn Sie einen eigenen BackupAgent implementiert haben, bedeutet dies wahrscheinlich, dass Sie der Sicherung keine Daten oder Dateien hinzugefügt haben.