Backup dei dati utente con Backup automatico
Backup automatico per app esegue automaticamente il backup dei dati di un utente da app thattarget ed eseguito su Android 6.0 (livello API 23) o versioni successive. Android conserva appdata caricandolo su Google Drive dell’utente—dove è protetto dalle credenziali dell’account Google dell’utente. La quantità di dati è limitata a 25 MB per utente della tua app e non ci sono costi per la memorizzazione dei dati di backup. La tua app può personalizzare il processo di backup o disattivare disablingbackups.
Per una panoramica delle opzioni di backup di Android e la guida su quali datayou dovrebbe eseguire il backup e il ripristino, vedere i dati backupoverview.
File di cui viene eseguito il backup
Per impostazione predefinita, il backup automatico include i file nella maggior parte delle directory assegnate all’app dal sistema:
- File delle preferenze condivise.
- File salvati nella memoria interna dell’app, accessibili da
getFilesDir()
ogetDir(String, int)
. - File nella directory restituita da
getDatabasePath(String)
, che include anche i file creati con la classeSQLiteOpenHelper
. - File su storage esterno nella directory restituita da
getExternalFilesDir(String)
.
Il backup automatico esclude i file nelle directory restituite dagetCacheDir()
getCodeCacheDir()
ogetNoBackupFilesDir()
. I file salvati in queste posizioni sono necessari solo temporaneamente, o sono intenzionalmente esclusi dalle operazioni di backup.
Puoi configurare la tua app per includere ed escludere file particolari. Per ulteriori informazioni, vedere la sezione Includi ed escludi file.
Nota: Android non tratta la configurazione dei componenti come dati utente. Se la tua app abilita o disabilita componenti specifici nel suo manifest mentre è in esecuzione, non aspettarti che AutoBackup salvi e ripristini la configurazione. Per preservare lo stato di configurazione, salvarlo in Preferenze condivise e recuperare preferenze condivise su restore. Se vuoi che la tua app salvi il suo stato, archivia lo stato nelle Preferenze condivise e recupera le preferenze condivise al ripristino.
Posizione di backup
I dati di backup vengono memorizzati in una cartella privata nell’account Google Drive dell’utente,limitata a 25 MB per app. I dati salvati non contano per l’utentepersonal Google Drive quota. Viene memorizzato solo il backup più recente. Quando viene effettuato abackup, il backup precedente (se esistente) viene eliminato. I dati di backup non possono essere letti dall’utente o da altre app sul dispositivo.
Gli utenti possono visualizzare un elenco di app di cui è stato eseguito il backup nell’app Google DriveAndroid. Su un dispositivo Android, gli utenti possono trovare questo elenco nel cassetto di navigazione di Driveapp in Impostazioni> Backup e ripristino> Dati dell’app.
I backup di ogni device-setup-lifetime sono archiviati in set di dati separati come mostrato nei seguenti esempi:
- Se l’utente possiede due dispositivi, esiste un set di dati di backup per ciascun dispositivo.
- Se la fabbrica utente ripristina un dispositivo e quindi imposta il dispositivo con lo stesso account, il backup viene memorizzato in un nuovo set di dati. I set di dati obsoleti vengono automaticamente eliminati dopo un periodo di inattività.
Programma di backup
I backup si verificano automaticamente quando sono soddisfatte tutte le seguenti condizioni:
- L’utente ha abilitato il backup sul dispositivo. In Android 9, questa impostazione è inSettings> Sistema> Backup.
- Sono trascorse almeno 24 ore dall’ultimo backup.
- Il dispositivo è inattivo.
- Il dispositivo è connesso a una rete Wi-Fi (se l’utente del dispositivo non ha optato per il backup dei dati mobili).
In pratica, queste condizioni si verificano all’incirca ogni notte, ma un dispositivo potrebbe non tornare mai indietro (ad esempio, se non si connette mai a una rete). Per conservare networkbandwidth, il caricamento avviene solo se i dati dell’app sono cambiati.
Durante il backup automatico, il sistema spegne l’app per assicurarsi che non stia più scrivendo nel file system. Per impostazione predefinita, il sistema di backup ignora le app in esecuzione in primo piano perché gli utenti noterebbero che le app vengono spente. È possibile ignorare il comportamento predefinito impostando l’attributobackupInForeground
su true.
Per semplificare i test, Android include strumenti che consentono di avviare manualmente un backup della tua app. Per ulteriori informazioni, vedere Test di backup e ripristino.
Programma di ripristino
I dati vengono ripristinati ogni volta che l’app viene installata, dal Play Store, durante la configurazione del dispositivo (quando il sistema installa app installate in precedenza) o dall’esecuzione di adb install. L’operazione di ripristino si verifica dopo l’APK è installato, ma prima che l’applicazione è disponibile per essere lanciato dall’utente.
Durante l’installazione guidata iniziale del dispositivo, all’utente viene mostrato un elenco di set di dati di backup disponibili e viene chiesto da quale ripristinare i dati. Qualsiasi set di dati di backup selezionato diventa il set di dati ancestrale per il dispositivo. Il dispositivo può essere ripristinato dai propri backup o dal set di dati ancestral. Il dispositivo dà la priorità al proprio backup se sono disponibili backup da entrambe le fonti. Se l’utente non è passato attraverso la procedura guidata di installazione del dispositivo, il dispositivo può ripristinare solo dai propri backup.
Per semplificare i test, Android include strumenti che consentono di avviare manualmente un ripristino della tua app. Per ulteriori informazioni, vedere Test di backup e ripristino.
Abilita e disabilita il backup
Le app destinate a Android 6.0 (livello API 23) o superiore partecipano automaticamente al backup automatico. Nel file manifest dell’app, imposta il valore booleanoandroid:allowBackup
per abilitare o disabilitare il backup. Il valore predefinito è true
ma per rendere chiare le tue intenzioni, ti consigliamo di impostare esplicitamente l’attributo nei tuoi manifesti mostrati di seguito:
<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>
È possibile disabilitare i backup impostandoandroid:allowBackup
sufalse
. Potresti voler farlo se la tua app può ricreare il suo stato attraverso qualche altro meccanismo o se la tua app si occupa di informazioni sensibili che Android non dovrebbe eseguire il backup.
Includi ed escludi file
Per impostazione predefinita, il sistema esegue il backup di quasi tutti i dati dell’app. Per ulteriori informazioni, vedere File di cui viene eseguito il backup. Questa sezione mostra come definire regole XML personalizzate per controllare ciò che viene eseguito il backup.
- In
AndroidManifest.xml
, aggiungere l’attributoandroid:fullBackupContent
all’elemento<application>
. Questo attributo punta a un file XML che contiene regole di backup. Ad esempio:<application ... android:fullBackupContent="@xml/my_backup_rules"></application>
- Crea un file XML chiamato
my_backup_rules.xml
nella directoryres/xml/
. All’interno del file, aggiungere regole con gli elementi<include>
e<exclude>
.Il seguente esempio esegue il backup di tutte le preferenze condivise trannedevice.xml
<?xml version="1.0" encoding="utf-8"?><full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/></full-backup-content>
XML config syntax
The XML syntax for the configuration file is shown below:
<full-backup-content> <include domain= path="string" requireFlags= /> <exclude domain= path="string" /></full-backup-content>
Inside the <full-backup-content>
tag, you can define <include>
and <exclude>
elements:
-
<include>
– Specifies a file or folder to backup. By default, Auto Backup includes almost all app files. Se si specifica un elemento<include>, il sistema non include più alcun file per impostazione predefinita e esegue il backup solo dei file specificati. Per includere più file, utilizzare più<include> elementi.Nota: i file nelle directory restituiti da
getCacheDir()
getCodeCacheDir()
, ogetNoBackupFilesDir()
sono sempre esclusi anche se si tenta di includerli. -
<exclude>
– Specifica un file o una cartella da escludere durante il backup. Ecco alcuni file che in genere sono esclusi dal backup:- File con identificatori specifici del dispositivo, emessi da un server o generati sul dispositivo. Ad esempio, Google Cloud Messaging (GCM) deve generare un token di registrazione ogni volta che un utente installa l’app su un nuovo dispositivo. Se il vecchio token di registrazione viene ripristinato, l’app potrebbe comportarsi in modo imprevisto.
- Credenziali dell’account o altre informazioni sensibili. È consigliabile chiedere all’utente di autenticare nuovamente la prima volta che avvia un’app ripristinata anziché consentire l’archiviazione di tali informazioni nel backup.
- File relativi al debug delle app.
- File di grandi dimensioni che fanno sì che l’app superi la quota di backup di 25 MB.
Nota: se il file di configurazione specifica entrambi gli elementi, il backup contiene tutto ciò che viene catturato dagli elementi<include>
meno le risorse denominate negli elementi<exclude>
. In altre parole,<exclude>
ha la precedenza.
Ogni elemento deve includere i seguenti due attributi:
-
domain
– specifica la posizione della risorsa. I valori validi per questo attributo includono quanto segue:-
root
– la directory sul filesystem in cui sono memorizzati tutti i file privati appartenenti a questa applicazione. -
file
– directory restituite dagetFilesDir()
. -
database
– directory restituite dagetDatabasePath()
. I database creati conSQLiteOpenHelper
sono memorizzati qui. -
sharedpref
– la directory in cui sono memorizzatiSharedPreferences
. -
external
la directory restituita dagetExternalFilesDir()
-
-
path
: Specifica un file o una cartella da includere o escludere dal backup. Si noti che:- Questo attributo non supporta la sintassi jolly o regex.
- È possibile utilizzare
.
per fare riferimento alla directory corrente, tuttavia, non è possibile fare riferimento alla directory principale..
per motivi di sicurezza. - Se si specifica una directory, la regola si applica a tutti i file nella directory e alle sottodirectory ricorsive.
Nota: non è possibile eseguire il backup dei file al di fuori di queste posizioni.
L’elemento include
può contenere anche l’attributo requireFlags
, che la sezione descrive come definire i requisiti condizionali per la sezione packup discute più dettagliatamente.
Definire le condizioni del dispositivo necessarie per il backup
Se l’app salva informazioni sensibili sul dispositivo, è possibile specificare le condizioni in base alle quali i dati dell’app sono inclusi nel backup dell’utente. È possibile aggiungere le seguenti condizioni in Android 9 (livello API 28) orhigher:
-
clientSideEncryption
: Il backup dell’utente è crittografato con un client-sidesecret. Questa forma di crittografia è abilitata su dispositivi che eseguono Android 9 ohigher finché l’utente ha abilitato il backup in Android 9 ohigher e ha impostato il blocco dello schermo (PIN,pattern o password) per il proprio dispositivo. -
deviceToDeviceTransfer
: L’utente sta trasferendo il backup su un altro dispositivo che supporta il trasferimento locale da dispositivo a dispositivo (ad esempio,Google Pixel).
Se hai aggiornato i dispositivi di sviluppo ad Android 9, è necessario disattivare e quindi riattivare il backup dei dati dopo l’aggiornamento. Questo perché Android onlyencrypts backup con un segreto lato client dopo aver informato gli utenti in Impostazioni orthe Setup Wizard.
Per dichiarare le condizioni di inclusione, imposta l’attributo requireFlags
al valore desiderato o ai valori nel tuo negli elementi <include>
all’interno del tuo set di regole di backup:
my_backup_rules.xml
<?xml version="1.0" encoding="utf-8"?><full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /><full-backup-content>
Se la vostra applicazione implementa un valore-chiave backupsystem, o se si implementBackupAgent te,è inoltre possibile applicare questi condizionale requisiti per il backup logica byperforming un confronto bit per bit tra unBackupDataOutput
oggetto’sset di trasporto bandiere e personalizzata agente di backup delFLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
o FLAG_DEVICE_TO_DEVICE_TRANSFER
bandiere.
Il seguente frammento di codice mostra un esempio di utilizzo di questo metodo:
Kotlin
class MyCustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here.}
Java
public class MyCustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here.}
Implementare BackupAgent
Applicazioni che implementano Auto Backup non è necessario implementare un BackupAgent
. Tuttavia, è possibile implementare opzionalmente un BackupAgent
personalizzato. In genere, ci sono due motivi per farlo:
- Si desidera ricevere la notifica di eventi di backup come,
onRestoreFinished()
oonQuotaExceeded(long, long)
. Questi metodi di callback vengono eseguiti anche se l’app non è in esecuzione. - Non è possibile esprimere facilmente l’insieme di file che si desidera eseguire il backup con regole XML. In questi rari casi, è possibile implementare un BackupAgent che sovrascrive
onFullBackup(FullBackupDataOutput)
per memorizzare ciò che si desidera. Per mantenere l’implementazione predefinita del sistema, chiamare il metodo corrispondente sulla superclasse consuper.onFullBackup()
.
Se si implementa un BackupAgent, per impostazione predefinita il sistema si aspetta che l’app esegua il backup e il ripristino di chiave/valore. Per utilizzare invece il backup automatico basato su file, impostare l’attributoandroid:fullBackupOnly
sutrue
nel manifest dell’app.
Durante le operazioni di backup e ripristino automatico, il sistema avvia l’app in modalità limitata per impedire all’app di accedere a file che potrebbero causare conflitti e consentire all’app di eseguire metodi di callback nel suoBackupAgent
. In questa modalità limitata, l’attività principale dell’app non viene avviata automaticamente, i suoi fornitori di contenuti non vengono inizializzati e la classe base Application
viene istanziata invece di qualsiasi sottoclasse dichiarata nel manifest dell’app.
Attenzione: per evitare errori, assicurati che le parti dell’app eseguite in modalità limitata (principalmente il tuoBackupAgent
) non accedano ai fornitori di contenuti nella stessa app o tentino di lanciare l’oggettoApplication
. Se non è possibile evitare tali modelli, prendere in considerazione l’implementazione del backup chiave/valore o la disattivazione completa del backup.
Il tuoBackupAgent
deve implementare i metodi astrattionBackup()
eonRestore()
, che vengono utilizzati per il backup chiave-valore. Ma se non si desidera eseguire il backup del valore chiave, è sufficiente lasciare vuota l’implementazione di tali metodi.
Per ulteriori informazioni, vedere Estensione di BackupAgent.