Testa backup e ripristino

Questa pagina mostra come testare i backup sul cloud e il processo di trasferimento da dispositivo a dispositivo (D2D) per la tua app. È importante testare entrambi questi elementi con ogni release principale dell'app per assicurarti che gli utenti possano continuare a utilizzare l'app su un nuovo dispositivo. Sebbene sia il backup sia il trasferimento siano simili, ci sono importanti differenze tra i due in Android 12 (livello API 31) e versioni successive. In particolare, il trasferimento ha un limite di dimensione dei dati molto più grande di 2 GB, rispetto ai 25 MB per il backup sul cloud.

Questa guida mostra come testare in modo efficiente sia il backup, il ripristino e il trasferimento D2D nel cloud durante tutto il ciclo di sviluppo.

Come funziona il test dei backup

Questa sezione descrive le varie parti del framework per il backup di Android e il modo in cui interagiscono con le app che supportano il backup automatico e il backup delle coppie chiave-valore. Durante la fase di sviluppo dell'app, la maggior parte del lavoro interno del framework viene ritirata, quindi non è necessario conoscere queste informazioni. Tuttavia, durante la fase di test, comprendere questi concetti diventa più importante.

Il seguente diagramma illustra il flusso di dati durante il backup e il ripristino sul cloud. A scopo di test, lo stesso dispositivo può essere utilizzato per il backup e il ripristino sul cloud.

Flusso di dati del framework di backup

Il seguente diagramma illustra il flusso di dati durante un trasferimento D2D:

Flusso di dati di Transfer Framework

A differenza dei test per il backup e il ripristino su cloud, i test D2D richiedono un dispositivo di origine e un dispositivo di destinazione da e verso.

Il servizio Backup Manager è un servizio di sistema Android che orchestra e avvia le operazioni di backup e ripristino. Il servizio è accessibile tramite l'API Backup Manager.

Durante un'operazione di backup, il servizio invia all'app una query per i dati di backup, quindi li passa al trasporto di backup, che a sua volta archivia i dati nel cloud. Durante un'operazione di ripristino, il servizio Backup Manager recupera i dati di backup dal trasporto di backup e li ripristina sul dispositivo. Per un trasferimento D2D, il servizio Backup Manager invia una query all'app per trovare i dati di backup e li passa direttamente al servizio Backup Manager sul nuovo dispositivo, che li carica nell'app.

I trasporti di backup sono componenti Android responsabili dell'archiviazione e del recupero dei dati dell'app. Un dispositivo con piattaforma Android può avere zero o più trasferimenti di backup, ma solo uno di questi trasporti può essere contrassegnato come attivo. I trasporti di backup disponibili variano da dispositivo a dispositivo a causa delle personalizzazioni da parte di produttori e fornitori di servizi, ma la maggior parte dei dispositivi abilitati per Google Play prevede i seguenti tipi di trasporto:

  • GMS Transport: il trasporto attivo per il backup sul cloud sulla maggior parte dei dispositivi, che fa parte di Google Mobile Services. Questo trasporto memorizza i dati in Android Backup Service.
  • Trasporto D2D: questo trasporto viene utilizzato nella migrazione D2D per trasferire i dati direttamente da un dispositivo all'altro.

Strumenti

Per testare le operazioni di backup e ripristino, devi conoscere meglio i seguenti strumenti.

  • adb: per eseguire comandi sul dispositivo o sull'emulatore.
  • bmgr: per eseguire varie operazioni di backup e ripristino.
  • logcat: per visualizzare l'output delle operazioni di backup e ripristino.

Backup di prova sul cloud

Il backup e il ripristino sul cloud possono essere eseguiti da un singolo dispositivo seguendo i passaggi descritti in questa sezione.

Prepara il dispositivo o l'emulatore per i backup sul cloud

Prepara il tuo dispositivo o emulatore per i test di backup seguendo il seguente elenco di controllo:

  1. Per il backup automatico, verifica di utilizzare un dispositivo o un emulatore con Android 6.0 (livello API 23) o versioni successive.
  2. Per il backup delle coppie chiave-valore, assicurati di utilizzare un dispositivo o un emulatore con Android 2.2 (livello API 8) o versioni successive.
  3. Devi disporre dell'accesso a internet per testare il backup sul cloud.
  4. Accedi al dispositivo con un Account Google e impostalo come account di backup in Impostazioni -> Google -> Backup.

Per testare il backup sul cloud, attiva un backup sul cloud, quindi disinstalla e reinstalla l'app. Per rendere ripetibili questi passaggi, puoi utilizzare il seguente script, test_cloud_backup.sh, che esegue il backup dell'app, scarica l'APK in locale, lo disinstalla e lo reinstalla:

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

Passaggi del test

  1. Apri l'app, accedi e modifica tutte le impostazioni.
  2. Esegui lo script, inserendo il nome del pacchetto, ad esempio test_cloud_backup.sh com.example.myapp
  3. Riapri l'app e verifica che funzioni correttamente, con tutti i dati conservati.

Non vuoi che gli utenti debbano effettuare l'accesso e tutte le impostazioni, l'avanzamento e i dati dell'app devono essere come erano prima. Se i risultati del test non soddisfano questi criteri, assicurati di aver configurato correttamente i backup, senza omettere i dati principali, e di gestire anche la ricreazione di tutti i dati memorizzati nella cache che hai escluso dal backup. Ripeti i passaggi da 1 a 3 per ogni iterazione del test.

Testa il trasferimento D2D

Il modo più completo per testare il trasferimento D2D è trasferire l'intero contenuto del telefono su un nuovo dispositivo di cui sono stati ripristinati i dati di fabbrica e verificare che funzioni correttamente. Tuttavia, questo può essere scomodo e richiedere molto tempo se è necessario ripetere la procedura più volte. Questi passaggi mostrano come simulare un trasferimento con un singolo dispositivo senza eseguire ripetutamente un ripristino dei dati di fabbrica sul dispositivo.

Prepara il dispositivo per i test D2D

Per testare il trasferimento D2D su un singolo dispositivo, preparalo nel seguente modo:

  1. Sul dispositivo deve essere installato Android 12 (livello API 31) o versioni successive.
  2. Per testare la versione più recente di D2D, scegli come target Android 12 (livello API 31) o versioni successive nella tua app.
  3. Crea il seguente script, test_d2d.sh, per supportare la ripetizione del test:
#!/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"

Passaggi del test

  1. Installa l'app che vuoi testare sul dispositivo.
  2. Apri l'app, accedi e modifica le impostazioni dell'app.
  3. Esegui lo script sul dispositivo, inserendo il nome del pacchetto, ad esempio test_d2d.sh com.example.myapp.
  4. Al termine dello script, apri l'app sul dispositivo e conferma che funzioni correttamente, mantenendo tutti i dati.

Non è necessario che gli utenti eseguano l'accesso e tutte le impostazioni, l'avanzamento e i dati dell'app devono essere visualizzati come prima dell'esecuzione dello script. Se i risultati del test non soddisfano questi criteri, assicurati di aver configurato correttamente il trasferimento, senza omettere dati chiave, e di gestire anche la ricreazione di tutti i dati memorizzati nella cache che hai escluso dal trasferimento. Ripeti i passaggi 2-4 per ogni iterazione del test.

Risolvere i problemi di backup e ripristino

Questa sezione ti aiuta a risolvere alcuni problemi comuni.

Quota di trasporto superata

I seguenti messaggi in Logcat indicano che la tua app ha superato la quota di trasporto:

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

--- or ---

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

Riduci la quantità di dati di backup e riprova. Ad esempio, verifica che i dati vengano memorizzati nella cache solo nella directory della cache dell'app. La directory della cache non è inclusa nei backup.

Impossibile eseguire il backup completo

Il seguente messaggio in Logcat indica che l'operazione di backup completo non è riuscita perché sul dispositivo non è ancora stata eseguita alcuna operazione di backup delle coppie chiave-valore:

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

Attiva un backup delle coppie chiave-valore con il comando bmgr run e riprova.

Timeout durante l'attesa dell'agente

Il seguente messaggio in Logcat indica che l'avvio dell'app richiede più di 10 secondi per il backup:

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

Osserva la differenza del timestamp nell'output del log. Questo errore si verifica in genere quando l'app utilizza una configurazione multidex senza ProGuard.

Account di backup non inizializzato

I seguenti messaggi in Logcat indicano che il backup è stato interrotto perché il set di dati di backup non è stato inizializzato:

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

Esegui il gestore di backup con il comando adb shell bmgr run, quindi prova a eseguire nuovamente il backup.

Metodi dell'app non chiamati

Poiché Backup automatico avvia l'app con una classe di base Application, è possibile che i metodi di configurazione dell'app non vengano chiamati. Il Backup automatico non avvia nessuna attività dell'app, pertanto potresti visualizzare errori se l'app viene configurata in un'attività. Per scoprire di più, consulta Implementare BackupAgent.

Al contrario, il backup delle coppie chiave-valore avvia la tua app con qualsiasi sottoclasse Application dichiarata nel file manifest dell'app.

Nessun dato di cui eseguire il backup

I seguenti messaggi in Logcat indicano che la tua app non ha dati di cui eseguire il backup:

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.

Se hai implementato il tuo BackupAgent, è probabile che tu non abbia aggiunto dati o file al backup.