Auto Backup for Apps realizează automat o copie de rezervă a datelor unui utilizator din aplicațiile care vizează și rulează pe Android 6.0 (nivel API 23) sau ulterior. Android conservă datele aplicațiilor prin încărcarea lor în Google Drive al utilizatorului – unde sunt protejate de acreditările contului Google al utilizatorului. Cantitatea de date este limitată la 25 MB pentru fiecare utilizator al aplicației dvs. și nu se percepe nicio taxă pentru stocarea datelor de rezervă. Aplicația dvs. poate personaliza procesul de copiere de rezervă sau poate renunța la acesta prin dezactivarea copierilor de rezervă.
Pentru o prezentare generală a opțiunilor de copiere de rezervă ale Android și îndrumări cu privire la datele pe care ar trebui să le copiați de rezervă și să le restaurați, consultați prezentarea generală a copierii de rezervă a datelor.
Filele care sunt copiate de rezervă
În mod implicit, Copie de rezervă automată include fișierele din majoritatea directoarelor care sunt atribuite aplicației dvs. de către sistem:
- Filele de preferințe partajate.
- Filele salvate în memoria internă a aplicației dumneavoastră, accesate prin sau
getDir(String, int)
. - Filele din directorul returnat de
getDatabasePath(String)
, care include, de asemenea, fișiere create cu clasaSQLiteOpenHelper
. - Filele de pe stocarea externă din directorul returnat de
getExternalFilesDir(String)
.
Backup automat exclude fișierele din directoarele returnate de getCacheDir()
getCodeCacheDir()
, sau getNoBackupFilesDir()
. Fișierele salvate în aceste locații sunt necesare doar temporar sau sunt excluse în mod intenționat din operațiunile de copiere de rezervă.
Vă puteți configura aplicația pentru a include și exclude anumite fișiere. Pentru mai multe informații, consultați secțiunea Includeți și excludeți fișiere.
Notă: Android nu tratează configurarea componentelor ca date ale utilizatorului. Dacă aplicația dvs. activează sau dezactivează componente specifice în manifestul său în timp ce rulează, nu vă așteptați ca AutoBackup să salveze și să restabilească configurația. Pentru a păstra starea de configurare, salvați-o în Preferințe partajate și recuperați Preferințe partajate la restaurare. Dacă doriți ca aplicația dvs. să își salveze starea, salvați starea în Preferințe partajate și recuperați Preferințe partajate la restaurare.
Localizarea copierii de rezervă
Datele de rezervă sunt stocate într-un dosar privat din contul Google Drive al utilizatorului,limitat la 25 MB per aplicație. Datele salvate nu se iau în calcul pentru cota personală Google Drive a utilizatorului. Doar cea mai recentă copie de rezervă este stocată. Atunci când se face o copie de rezervă, copia de rezervă anterioară (dacă există una) este ștearsă. Datele de backup nu pot fi citite de către utilizator sau de către alte aplicații de pe dispozitiv.
Utilizatorii pot vedea o listă a aplicațiilor care au fost salvate în aplicația Google DriveAndroid. Pe un dispozitiv cu Android, utilizatorii pot găsi această listă în sertarul de navigare al aplicației Driveapp sub Settings > Backup and reset > App data.
Copiile de rezervă de la fiecare dispozitiv-setup-lifetime sunt stocate în seturi de date separate, așa cum se arată în următoarele exemple:
- Dacă utilizatorul deține două dispozitive, atunci există un set de date de rezervă pentru fiecare dispozitiv.
- Dacă utilizatorul resetează din fabrică un dispozitiv și apoi configurează dispozitivul cu același cont, copia de rezervă este stocată într-un nou set de date. Seturile de date învechite sunt șterse automat după o perioadă de inactivitate.
Programul de copiere de rezervă
Cupările de rezervă au loc automat atunci când sunt îndeplinite toate condițiile următoare:
- Utilizatorul a activat copierea de rezervă pe dispozitiv. În Android 9, această setare se află înSettings > System > Backup.
- Au trecut cel puțin 24 de ore de la ultima copie de rezervă.
- Aparatul este inactiv.
- Dispozitivul este conectat la o rețea Wi-Fi (dacă utilizatorul dispozitivului nu a optat pentru copiile de rezervă ale datelor mobile).
În practică, aceste condiții apar aproximativ în fiecare noapte, dar este posibil ca un dispozitiv să nu facă niciodată o copie de rezervă (de exemplu, dacă nu se conectează niciodată la o rețea). Pentru a conserva lățimea de bandă a rețelei, încărcarea are loc numai dacă datele aplicației s-au modificat.
În timpul copierii automate de rezervă, sistemul oprește aplicația pentru a se asigura că nu mai scrie în sistemul de fișiere. În mod implicit, sistemul de backup ignoră aplicațiile care rulează în prim-plan, deoarece utilizatorii ar observa că aplicațiile lor sunt închise. Puteți suprascrie comportamentul implicit prin setarea atributului backupInForeground
la true.
Pentru a simplifica testarea, Android include instrumente care vă permit să inițiați manual o copie de rezervă a aplicației dumneavoastră. Pentru mai multe informații, consultați Testarea copierii de rezervă și a restaurării.
Programul de restaurare
Datele sunt restaurate ori de câte ori este instalată aplicația, fie din magazinul Play, fie în timpul configurării dispozitivului (când sistemul instalează aplicațiile instalate anterior), fie prin rularea aplicației adb install. Operațiunea de restaurare are loc după instalarea APK-ului, dar înainte ca aplicația să fie disponibilă pentru a fi lansată de către utilizator.
În timpul asistentului inițial de configurare a dispozitivului, utilizatorului i se afișează o listă de seturi de date de rezervă disponibile și este întrebat din care să restaureze datele. Orice set de date de rezervă selectat devine setul de date ancestral pentru dispozitiv. Dispozitivul poate restaura fie din propriile sale copii de rezervă, fie din setul de date ancestral. Dispozitivul își prioritizează propria copie de rezervă în cazul în care sunt disponibile copii de rezervă din ambele surse. Dacă utilizatorul nu a trecut prin expertul de configurare a dispozitivului, atunci dispozitivul poate restaura numai din propriile sale copii de rezervă.
Pentru a simplifica testarea, Android include instrumente care vă permit să inițiați manual o restaurare a aplicației dumneavoastră. Pentru mai multe informații, consultați Testarea copierii de rezervă și a restaurării.
Activați și dezactivați copia de rezervă
Aplicațiile care vizează Android 6.0 (nivel API 23) sau mai mare participă automat la Auto Backup. În fișierul manifest al aplicației dumneavoastră, setați valoarea booleanăandroid:allowBackup
pentru a activa sau dezactiva salvarea. Valoarea implicită este true
, dar pentru ca intențiile dvs. să fie clare, vă recomandăm să setați explicit atributul în manifestul dvs. așa cum se arată mai jos:
<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>
Puteți dezactiva copiile de rezervă prin setarea android:allowBackup
la false
. S-ar putea să doriți să faceți acest lucru dacă aplicația dvs. își poate recrea starea printr-un alt mecanismsau dacă aplicația dvs. se ocupă cu informații sensibile pe care Android nu ar trebui să le salveze.
Includeți și excludeți fișiere
În mod implicit, sistemul salvează aproape toate datele aplicației. Pentru mai multe informații, consultați Fișiere care fac obiectul unei copii de rezervă. Această secțiune vă arată cum să definiți reguli XML personalizate pentru a controla ce se copiază de rezervă.
- În
AndroidManifest.xml
, adăugați atributulandroid:fullBackupContent
la elementul<application>
. Acest atribut indică un fișier XML care conține reguli de backup. For example:<application ... android:fullBackupContent="@xml/my_backup_rules"></application>
- Create an XML file called
my_backup_rules.xml
in theres/xml/
directory. Inside the file, add rules with the<include>
and<exclude>
elements.The following sample backs up all shared preferences exceptdevice.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. If you specify an <include> element, the system no longer includes any files by default and backs up only the files specified. Pentru a include mai multe fișiere, utilizați mai multe elemente <include>.Notă: Fișierele din directoarele returnate de
getCacheDir()
getCodeCacheDir()
saugetNoBackupFilesDir()
sunt întotdeauna excluse chiar dacă încercați să le includeți. -
<exclude>
– Specifică un fișier sau un folder care trebuie exclus în timpul copierii de rezervă. Iată câteva fișiere care sunt de obicei excluse din backup:- Filele care au identificatori specifici dispozitivului, fie emiși de un server, fie generați pe dispozitiv. De exemplu, Google Cloud Messaging (GCM) trebuie să genereze un token de înregistrare de fiecare dată când un utilizator instalează aplicația dvs. pe un dispozitiv nou. Dacă vechiul token de înregistrare este restaurat, aplicația se poate comporta în mod neașteptat.
- Credențiale de cont sau alte informații sensibile. Luați în considerare posibilitatea de a cere utilizatorului să se autentifice din nou prima dată când lansează o aplicație restaurată, mai degrabă decât să permiteți stocarea unor astfel de informații în copia de rezervă.
- File legate de depanarea aplicației.
- Large files that cause the app to exceed the 25MB backup quota.
Note: If your configuration file specifies both elements, then the backup contains everything captured by the <include>
elements minus the resources named in the <exclude>
elements. In other words, <exclude>
takes precedence.
Each element must include the following two attributes:
-
domain
– specifies the location of resource. Valid values for this attribute include the following:-
root
– the directory on the filesystem where all private files belonging to this app are stored. -
file
– directories returned bygetFilesDir()
. -
database
– directories returned bygetDatabasePath()
. Databases created withSQLiteOpenHelper
are stored here. -
sharedpref
– the directory whereSharedPreferences
are stored. -
external
the directory returned bygetExternalFilesDir()
-
-
path
: Specifies a file or folder to include in or exclude from backup. Note that:- This attribute does not support wildcard or regex syntax.
- You can use
.
to reference the current directory, however, you cannot reference the parent directory..
for security reasons. - If you specify a directory, then the rule applies to all files in the directory and recursive sub-directories.
Note: You cannot back up files outside of these locations.
The include
element can also contain the requireFlags
attribute, which thesection describing how to define conditional requirements forbackup section discusses in more detail.
Definiți condițiile dispozitivului necesare pentru backup
Dacă aplicația dvs. salvează informații sensibile pe dispozitiv, puteți specificacondițiile în care datele aplicației dvs. sunt incluse înbackup-ul utilizatorului. Puteți adăuga următoarele condiții în Android 9 (nivel API 28) sau mai mare:
-
clientSideEncryption
: Salvarea utilizatorului este criptată cu un client-sidesecret. Această formă de criptare este activată pe dispozitivele care rulează Android 9 orhigher atâta timp cât utilizatorul a activat backup-ul în Android 9 orhigher și a setat o blocare ascendentă (PIN, model sau parolă) pentru dispozitivul său. -
deviceToDeviceTransfer
: Utilizatorul își transferă copia de rezervă pe un altdispozitiv care acceptă transferul local de la dispozitiv la dispozitiv (de exemplu,Google Pixel).
Dacă v-ați actualizat dispozitivele de dezvoltare la Android 9, trebuie să dezactivațiși apoi să activați din nou copia de rezervă a datelor după actualizare. Acest lucru se datorează faptului că Android criptează copiile de rezervă cu un secret pe partea clientului numai după ce informează utilizatorii în Setări sau în Asistentul de configurare.
Pentru a declara condițiile de includere, setați atributul requireFlags
la valoarea sau valorile dorite în elementele <include>
din cadrul setului dvs. de reguli de 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>
În cazul în care aplicația dvs. implementează un sistem de backup cu valori cheie sau dacă implementațiBackupAgent singur,puteți, de asemenea, să aplicați aceste cerințe condiționale logicii dvs. de backup prin efectuarea unei comparații de tip bitwise între unBackupDataOutput
set de steaguri de transport ale unui obiectBackupDataOutput
și steagurile agentului dvs. de backup personalizatFLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
sau FLAG_DEVICE_TO_DEVICE_TRANSFER
flags.
Secvența de cod următoare arată un exemplu de utilizare a acestei metode:
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.}
Implement BackupAgent
Apps that implement Auto Backup do not need to implement a BackupAgent
. However, you can optionally implement a custom BackupAgent
. Typically, there are two reasons for doing this:
- You want to receive notification of backup events such as,
onRestoreFinished()
oronQuotaExceeded(long, long)
. These callback methods are executed even if the app is not running. - You can’t easily express the set of files you want to backup with XML rules. In these rare cases, you can implement a BackupAgent that overrides
onFullBackup(FullBackupDataOutput)
to store what you want. To retain the system’s default implementation, call the corresponding method on the superclass withsuper.onFullBackup()
.
If you implement a BackupAgent, by default the system expects your app to perform key/value backup and restore. Pentru a utiliza în schimb Auto Backup bazat pe fișiere, setați atributul la true
în manifestul aplicației dumneavoastră.
În timpul operațiunilor de backup și restaurare automată, sistemul lansează aplicația într-un mod restricționat atât pentru a împiedica aplicația să acceseze fișiere care ar putea cauza conflicte, cât și pentru a permite aplicației să execute metode de apelare în BackupAgent
. În acest mod restricționat, activitatea principală a aplicației nu este lansată automat, furnizorii săi de conținut nu sunt inițializați, iar clasa de bază Application
este instanțiată în locul oricărei subclase declarate în manifestul aplicației.
Atenție: Pentru a evita erorile, asigurați-vă că părțile aplicației dvs. care se execută în modul restricționat (în principal BackupAgent
) nu accesează furnizorii de conținut din aceeași aplicație și nici nu încearcă să distribuie obiectul Application
. Dacă nu puteți evita aceste tipare, luați în considerare implementarea copierii de rezervă cheie/valoare sau dezactivarea completă a copierii de rezervă.
Dvs. BackupAgent
trebuie să implementeze metodele abstracte onBackup()
și onRestore()
, care sunt utilizate pentru copierea de rezervă cheie/valoare. Dar dacă nu doriți să efectuați salvarea valorilor cheie, puteți lăsa implementarea acestor metode goală.
Pentru mai multe informații, consultați Extinderea BackupAgent.
.