Utwórz kopię zapasową danych Użytkownika za pomocą funkcji Auto Backup
Automatyczna kopia zapasowa dla aplikacji automatycznie tworzy kopię zapasową danych użytkownika z aplikacji, które można pobrać i uruchomić na Androidzie 6.0 (API poziom 23) lub nowszym. Android zachowuje dane aplikacji, przesyłając je na Dysk Google użytkownika—Gdzie są chronione przez poświadczenia konta Google użytkownika. Ilość danych jest ograniczona do 25 MB na użytkownika aplikacji i nie ma opłat za przechowywanie danych kopii zapasowej. Twoja aplikacja może dostosować proces tworzenia kopii zapasowych lub zrezygnować, wyłączając kopie zapasowe.
przegląd opcji tworzenia kopii zapasowych Androida i wskazówek dotyczących tego, które dane należy wykonać i przywrócić, zobacz backupoverview danych.
pliki, których kopie zapasowe są archiwizowane
domyślnie Automatyczna kopia zapasowa zawiera pliki w większości katalogów przypisanych do aplikacji przez system:
- udostępnione pliki preferencji.
- pliki zapisane w pamięci wewnętrznej aplikacji, dostępne przez
getFilesDir()
lubgetDir(String, int)
. - pliki w katalogu zwracane przez
getDatabasePath(String)
, który zawiera również pliki utworzone za pomocą klasySQLiteOpenHelper
. - pliki na zewnętrznej pamięci w katalogu zwracane przez
getExternalFilesDir(String)
.
Automatyczna kopia zapasowa wyklucza pliki w katalogach zwracane przezgetCacheDir()
getCodeCacheDir()
lubgetNoBackupFilesDir()
. Pliki zapisane w tych lokalizacjach są potrzebne tylko tymczasowo lub są celowo wykluczone z operacji tworzenia kopii zapasowych.
możesz skonfigurować aplikację tak, aby uwzględniała i wykluczała określone pliki. Aby uzyskać więcej informacji, zobacz sekcję dołączanie i wykluczanie plików.
Uwaga: Android nie traktuje konfiguracji komponentów jako danych użytkownika. Jeśli aplikacja włącza lub wyłącza określone komponenty w swoim manifeście podczas działania, nie oczekuj, że AutoBackup zapisze i przywróci konfigurację. Aby zachować stan konfiguracji, zapisz go w preferencjach współdzielonych i odzyskaj Preferencje współdzielone podczas przywracania. Jeśli chcesz, aby aplikacja zapisała swój stan, Zapisz stan w preferencjach udostępnionych i odzyskaj Preferencje udostępnione podczas przywracania.
lokalizacja kopii zapasowej
Dane kopii zapasowej są przechowywane w prywatnym folderze na koncie Google Drive użytkownika,ograniczonym do 25 MB na aplikację. Zapisane dane nie liczą się do osobistego limitu Dysku Google użytkownika. Przechowywana jest Tylko najnowsza kopia zapasowa. Po wykonaniu abackup, poprzednia kopia zapasowa (jeśli taka istnieje) jest usuwana. Dane kopii zapasowej nie mogą być odczytywane przez użytkownika ani inne aplikacje na urządzeniu.
użytkownicy mogą zobaczyć listę aplikacji, które zostały zarchiwizowane w aplikacji Google DriveAndroid. Na urządzeniu z systemem Android użytkownicy mogą znaleźć tę listę w szufladzie nawigacyjnej Driveapp w Ustawieniach > tworzenie kopii zapasowych i resetowanie > Dane aplikacji.
kopie zapasowe z każdego urządzenia-setup-lifetime są przechowywane w oddzielnych zestawach danych, jak pokazano w poniższych przykładach:
- Jeśli użytkownik jest właścicielem dwóch urządzeń, to dla każdego urządzenia istnieje zapasowy zestaw danych.
- jeśli użytkownik fabrycznie zresetuje urządzenie, a następnie skonfiguruje urządzenie z tym samym kontem, kopia zapasowa jest przechowywana w nowym zestawie danych. Przestarzałe zbiory danych są automatycznie usuwane po okresie nieaktywności.
harmonogram tworzenia kopii zapasowych
tworzenie kopii zapasowych odbywa się automatycznie, gdy spełnione są wszystkie poniższe warunki:
- użytkownik włączył tworzenie kopii zapasowych na urządzeniu. W systemie Android 9 to ustawienie to wstawki > System > Kopia zapasowa.
- minęły co najmniej 24 godziny od ostatniej kopii zapasowej.
- urządzenie jest bezczynne.
- urządzenie jest podłączone do sieci Wi-Fi (jeśli użytkownik urządzenia nie zdecydował się na tworzenie kopii zapasowych danych mobilnych).
w praktyce warunki te występują mniej więcej co noc, ale urządzenie może nigdy się nie włączyć (na przykład, jeśli nigdy nie połączy się z siecią). Aby zachować networkbandwidth, przesyłanie odbywa się tylko wtedy, gdy dane aplikacji uległy zmianie.
podczas automatycznego tworzenia kopii zapasowych system wyłącza aplikację, aby upewnić się, że nie zapisuje już do systemu plików. Domyślnie system kopii zapasowych ignoruje aplikacje działające na pierwszym planie, ponieważ użytkownicy zauważyliby, że ich aplikacje są zamykane. Domyślne zachowanie można zastąpić, ustawiając atrybutbackupInForeground
na true.
aby uprościć testowanie, Android zawiera narzędzia, które umożliwiają ręczne inicjowanie kopii zapasowej aplikacji. Aby uzyskać więcej informacji, zobacz testowanie kopii zapasowej i przywracania.
harmonogram przywracania
dane są przywracane po zainstalowaniu aplikacji, ze Sklepu Play, podczas konfiguracji urządzenia (gdy system instaluje wcześniej zainstalowane aplikacje) lub z uruchomionej instalacji adb. Operacja przywracania odbywa się po zainstalowaniu pliku APK, ale przed uruchomieniem aplikacji przez użytkownika.
podczas początkowego kreatora konfiguracji urządzenia użytkownik wyświetla listę dostępnych zestawów danych kopii zapasowych i jest pytany, z którego z nich przywrócić dane. Niezależnie od tego, który zestaw danych kopii zapasowej zostanie wybrany, będzie on zbiorem danych przodków dla urządzenia. Urządzenie może przywrócić z własnych kopii zapasowych lub z zestawu danych przodków. Urządzenie nadaje priorytet własnej kopii zapasowej, jeśli dostępne są kopie zapasowe z obu źródeł. Jeśli użytkownik nie przeszedł kreatora konfiguracji urządzenia, urządzenie może przywrócić tylko z własnych kopii zapasowych.
aby uprościć testowanie, Android zawiera narzędzia, które umożliwiają ręczne zainicjowanie przywracania aplikacji. Aby uzyskać więcej informacji, zobacz testowanie kopii zapasowej i przywracania.
Włączanie i wyłączanie tworzenia kopii zapasowych
Aplikacje docelowe Android 6.0 (poziom API 23) lub wyższy automatycznie uczestniczą w automatycznej kopii zapasowej. W pliku manifestu aplikacji Ustaw wartość logicznąandroid:allowBackup
, aby włączyć lub wyłączyć tworzenie kopii zapasowych. Domyślną wartością jesttrue
ale aby Twoje uwagi były jasne, zalecamy jawne ustawienie atrybutu w manifestach pokazanych poniżej:
<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>
możesz wyłączyć tworzenie kopii zapasowych, ustawiającandroid:allowBackup
nafalse
. Możesz to zrobić, jeśli Twoja aplikacja może odtworzyć swój stan za pomocą innego mechanizmub jeśli Twoja aplikacja zajmuje się poufnymi informacjami, których Android nie powinien tworzyć kopii zapasowych.
dołączanie i wykluczanie plików
Domyślnie system tworzy kopię zapasową prawie wszystkich danych aplikacji. Aby uzyskać więcej informacji, zobacz pliki, które są archiwizowane. Ta sekcja pokazuje, jak zdefiniować niestandardowe reguły XML, aby kontrolować kopie zapasowe.
- w
AndroidManifest.xml
Dodaj atrybutandroid:fullBackupContent
do elementu<application>
. Ten atrybut wskazuje na plik XML zawierający reguły tworzenia kopii zapasowych. Na przykład:<application ... android:fullBackupContent="@xml/my_backup_rules"></application>
- Utwórz plik XML o nazwie
my_backup_rules.xml
w katalogures/xml/
. Wewnątrz pliku dodaj reguły za pomocą elementów<include>
I<exclude>
.Poniższy przykład tworzy kopię zapasową wszystkich preferencji współdzielonych z wyjątkiemdevice.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. Jeśli podasz element<include>, system nie zawiera już domyślnie żadnych plików i tworzy kopię zapasową tylko podanych plików. Aby dołączyć wiele plików, użyj wielu elementów<Dołącz>.Uwaga: pliki w katalogach zwracane przez
getCacheDir()
getCodeCacheDir()
lubgetNoBackupFilesDir()
są zawsze wykluczone, nawet jeśli spróbujesz je uwzględnić. -
<exclude>
– Określa plik lub folder do wykluczenia podczas tworzenia kopii zapasowej. Oto niektóre pliki, które są zazwyczaj wykluczone z kopii zapasowej:- pliki, które mają identyfikatory specyficzne dla urządzenia, wydane przez serwer lub wygenerowane na urządzeniu. Na przykład Google Cloud Messaging (GCM) musi generować token rejestracyjny za każdym razem, gdy użytkownik instaluje aplikację na nowym urządzeniu. Jeśli stary token rejestracyjny zostanie przywrócony, aplikacja może zachowywać się nieoczekiwanie.
- poświadczenia konta lub inne poufne informacje. Rozważ poproszenie użytkownika o ponowne uwierzytelnienie przy pierwszym uruchomieniu przywróconej aplikacji, zamiast zezwalania na przechowywanie takich informacji w kopii zapasowej.
- pliki związane z debugowaniem aplikacji.
- duże pliki, które powodują, że aplikacja przekracza limit kopii zapasowych 25MB.
Uwaga: Jeśli Twój plik konfiguracyjny określa oba elementy, wtedy kopia zapasowa zawiera wszystko przechwycone przez<include>
elementy minus zasoby wymienione w<exclude>
elementy. Innymi słowy, <exclude>
ma pierwszeństwo.
każdy element musi zawierać dwa atrybuty:
-
domain
– określa lokalizację zasobu. Poprawne wartości dla tego atrybutu to:-
root
– katalog w systemie plików, w którym przechowywane są wszystkie prywatne pliki należące do tej aplikacji. -
file
– katalogi zwracane przezgetFilesDir()
. -
database
– katalogi zwracane przezgetDatabasePath()
. Bazy danych utworzone za pomocąSQLiteOpenHelper
są przechowywane tutaj. -
sharedpref
– katalog, w którym przechowywane sąSharedPreferences
. -
external
katalog zwracany przezgetExternalFilesDir()
-
-
path
: Określa plik lub folder do włączenia lub wykluczenia z kopii zapasowej. Zauważ, że:- ten atrybut nie obsługuje składni wieloznacznej ani regex.
- możesz użyć
.
, aby odwołać się do bieżącego katalogu, jednak nie możesz odwołać się do katalogu nadrzędnego..
ze względów bezpieczeństwa. - Jeśli podasz Katalog, to reguła dotyczy wszystkich plików w katalogu i podkatalogów rekurencyjnych.
uwaga: nie można tworzyć kopii zapasowych plików poza tymi lokalizacjami.
elementinclude
może również zawierać atrybutrequireFlags
, który w sekcji opisującej jak definiować wymagania warunkowe do tworzenia kopii zapasowych omawiany jest bardziej szczegółowo.
określ warunki urządzenia wymagane do tworzenia kopii zapasowych
Jeśli Twoja aplikacja zapisuje poufne informacje na urządzeniu, możesz określić warunki, w których dane twojej aplikacji są zawarte w kopii zapasowej użytkownika. Możesz dodać następujące warunki w Androidzie 9 (poziom API 28) orhigher:
-
clientSideEncryption
: kopia zapasowa użytkownika jest szyfrowana za pomocą Client-sidesecret. Ta forma szyfrowania jest włączona na urządzeniach z systemem Android 9 orhigher, o ile użytkownik włączył kopię zapasową w Android 9 orhigher i ustawił blokadę ekranu (PIN,wzór lub hasło) dla swojego urządzenia. -
deviceToDeviceTransfer
: użytkownik przenosi swoją kopię zapasową na inne urządzenie,które obsługuje lokalny interfejs device-to-devicetransfer (na przykład Google Pixel).
Jeśli zaktualizowałeś swoje urządzenia programistyczne do Androida 9, musisz je wyłączyć, a następnie ponownie włączyć kopię zapasową danych po aktualizacji. Dzieje się tak dlatego, że tylko Android odszyfrowuje kopie zapasowe za pomocą tajemnicy po stronie klienta po poinformowaniu użytkowników w Ustawieniach lub Kreatorze konfiguracji.
aby zadeklarować warunki włączenia, UstawrequireFlags
atrybut na wymaganą wartość lub wartości w<include>
elementy w swoim zestawie reguł tworzenia kopii zapasowych:
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>
Jeśli Twoja aplikacja implementuje system kopii zapasowych z wartością klucza lub jeśli sam implementujesz backupagent, możesz również zastosować te wymagania warunkowe do swojej logiki tworzenia kopii zapasowych,przeprowadzając bitowe porównanie międzyBackupDataOutput
zestaw flag transportowych obiektów iFLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
lub FLAG_DEVICE_TO_DEVICE_TRANSFER
flagi.
poniższy fragment kodu pokazuje przykładowe zastosowanie tej metody:
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.}
implementacja BackupAgent
aplikacje, które implementują automatyczną kopię zapasową, nie muszą implementować BackupAgent
. Możesz jednak opcjonalnie zaimplementować Niestandardowy BackupAgent
. Zazwyczaj istnieją dwa powody, aby to zrobić:
- chcesz otrzymywać powiadomienia o zdarzeniach tworzenia kopii zapasowych, takich jak
onRestoreFinished()
lubonQuotaExceeded(long, long)
. Te metody wywołania zwrotnego są wykonywane nawet wtedy, gdy aplikacja nie jest uruchomiona. - nie możesz łatwo wyrazić zestawu plików, które chcesz wykonać za pomocą reguł XML. W tych rzadkich przypadkach można zaimplementować BackupAgent, który nadpisuje
onFullBackup(FullBackupDataOutput)
, aby zapisać to, co chcesz. Aby zachować domyślną implementację systemu, należy wywołać odpowiednią metodę w klasie nadrzędnej zsuper.onFullBackup()
.
Jeśli zaimplementujesz BackupAgent, Domyślnie system oczekuje, że aplikacja wykona i przywróci kopię zapasową klucza / wartości. Aby użyć automatycznej kopii zapasowej opartej na plikach, ustaw atrybutandroid:fullBackupOnly
natrue
w manifeście aplikacji.
podczas operacji automatycznego tworzenia kopii zapasowych i przywracania system uruchamia aplikację w trybie ograniczonym, aby zarówno uniemożliwić aplikacji dostęp do plików, które mogą powodować konflikty, jak i pozwolić aplikacji wykonywać metody zwrotne w BackupAgent
. W tym ograniczonym trybie główna aktywność aplikacji nie jest uruchamiana automatycznie, jej dostawcy treści nie są inicjowani, a klasa podstawowa Application
jest instancjowana zamiast dowolnej podklasy zadeklarowanej w manifeście aplikacji.
uwaga: aby uniknąć błędów, upewnij się, że części aplikacji, które działają w trybie ograniczonym (głównie BackupAgent
) nie mają dostępu do dostawców treści w tej samej aplikacji ani nie próbują rzucić obiektu Application
. Jeśli nie możesz uniknąć tych wzorców, rozważ wdrożenie kopii zapasowej klucz / wartość lub całkowite wyłączenie kopii zapasowej.
TwójBackupAgent
musi zaimplementować abstrakcyjne metodyonBackup()
IonRestore()
, które są używane do tworzenia kopii zapasowych wartości klucza. Ale jeśli nie chcesz wykonywać kopii zapasowej wartości klucza, możesz po prostu pozostawić implementację tych metod pustą.
aby uzyskać więcej informacji, zobacz rozszerzenie BackupAgent.