Sichern Sie Benutzerdaten mit Auto Backup
Auto Backup für Apps sichert automatisch die Daten eines Benutzers von Apps, die auf Android 6.0 (API Level 23) oder höher abzielen und ausgeführt werden. Android bewahrt Appdata auf, indem es sie auf das Google Drive des Benutzers hochlädt — wo sie durch die Anmeldeinformationen des Google-Kontos des Benutzers geschützt sind. Die Datenmenge ist auf 25 MB pro Benutzer Ihrer App begrenzt und das Speichern von Sicherungsdaten ist kostenlos. Ihre App cancustomize den Backup-Prozess oder Opt-out durch disablingbackups.
Eine Übersicht über die Sicherungsoptionen von Android und Anleitungen dazu, welche Daten Sie sichern und wiederherstellen sollten, finden Sie in der Datensicherungübersicht.
Dateien, die gesichert werden
Standardmäßig enthält die automatische Sicherung Dateien in den meisten Verzeichnissen, die Ihrer App vom System zugewiesen sind:
- Freigegebene Einstellungsdateien.
- Dateien, die im internen Speicher Ihrer App gespeichert sind und über
getFilesDir()
odergetDir(String, int)
aufgerufen werden können. - Dateien in dem von
getDatabasePath(String)
zurückgegebenen Verzeichnis, das auch Dateien enthält, die mit der KlasseSQLiteOpenHelper
erstellt wurden. - Dateien auf externem Speicher in dem von
getExternalFilesDir(String)
zurückgegebenen Verzeichnis.
Die automatische Sicherung schließt Dateien in Verzeichnissen aus, die von getCacheDir()
getCodeCacheDir()
oder getNoBackupFilesDir()
zurückgegeben werden. Die an diesen Speicherorten gespeicherten Dateien werden nur vorübergehend benötigt oder absichtlich von Sicherungsvorgängen ausgeschlossen.
Sie können Ihre App so konfigurieren, dass bestimmte Dateien ein- und ausgeschlossen werden. Weitere Informationen finden Sie im Abschnitt Dateien einschließen und Ausschließen.Hinweis: Android behandelt die Konfiguration von Komponenten nicht als Benutzerdaten. Wenn Ihre App während der Ausführung bestimmte Komponenten in ihrem Manifest aktiviert oder deaktiviert, erwarten Sie nicht, dass AutoBackup die Konfiguration speichert und wiederherstellt. Um den Konfigurationsstatus beizubehalten, speichern Sie ihn in den freigegebenen Einstellungen und stellen Sie die freigegebenen Einstellungen bei der Wiederherstellung wieder her. Wenn Sie möchten, dass Ihre App ihren Status speichert, speichern Sie den Status in den freigegebenen Einstellungen und stellen Sie die freigegebenen Einstellungen bei der Wiederherstellung wieder her.
Speicherort der Sicherung
Die Sicherungsdaten werden in einem privaten Ordner im Google Drive-Konto des Benutzers gespeichert, der auf 25 MB pro App beschränkt ist. Die gespeicherten Daten werden nicht auf das persönliche Google Drive-Kontingent des Nutzers angerechnet. Es wird nur das aktuellste Backup gespeichert. Wenn ein Backup erstellt wird, wird das vorherige Backup (falls vorhanden) gelöscht. Die Sicherungsdaten können nicht vom Benutzer oder anderen Apps auf dem Gerät gelesen werden.
Benutzer können eine Liste der Apps anzeigen, die in der Google DriveAndroid-App gesichert wurden. Auf einem Android-Gerät finden Benutzer diese Liste in der Navigationsleiste der Driveapp unter Einstellungen > Sichern und Zurücksetzen > App-Daten.
Backups von jedem device-setup-lifetime werden in separaten Datensätzen gespeichert, wie in den folgenden Beispielen gezeigt:
- Wenn der Benutzer zwei Geräte besitzt, gibt es für jedes Gerät ein Backup-Dataset.
- Wenn der Benutzer ein Gerät auf die Werkseinstellungen zurücksetzt und das Gerät dann mit demselben Konto einrichtet, wird die Sicherung in einem neuen Datensatz gespeichert. Veraltete Datensätze werden nach einer Zeit der Inaktivität automatisch gelöscht.
Sicherungszeitplan
Sicherungen erfolgen automatisch, wenn alle folgenden Bedingungen erfüllt sind:
- Der Benutzer hat die Sicherung auf dem Gerät aktiviert. In Android 9 ist diese Einstellung inSettings > System > Backup.
- Seit dem letzten Backup sind mindestens 24 Stunden vergangen.
- Das Gerät befindet sich im Leerlauf.
- Das Gerät ist mit einem Wi-Fi-Netzwerk verbunden (wenn der Gerätebenutzer sich nicht für mobile Datensicherungen entschieden hat).
In der Praxis treten diese Bedingungen ungefähr jede Nacht auf, aber ein Gerät wird möglicherweise nie wieder aufgeladen (z. B. wenn es nie eine Verbindung zu einem Netzwerk herstellt). Um networkbandwidth zu schonen, erfolgt der Upload nur, wenn sich die App-Daten geändert haben.
Während der automatischen Sicherung fährt das System die App herunter, um sicherzustellen, dass sie nicht mehr in das Dateisystem schreibt. Standardmäßig ignoriert das Sicherungssystem Apps, die im Vordergrund ausgeführt werden, da Benutzer bemerken würden, dass ihre Apps heruntergefahren werden. Sie können das Standardverhalten überschreiben, indem Sie das Attribut backupInForeground
auf true setzen.
Um das Testen zu vereinfachen, enthält Android Tools, mit denen Sie manuell ein Backup Ihrer App initiieren können. Weitere Informationen finden Sie unter Testsicherung und -wiederherstellung.
Wiederherstellungszeitplan
Daten werden bei jeder Installation der App wiederhergestellt, entweder aus dem Play Store, während der Geräteeinrichtung (wenn das System zuvor installierte Apps installiert) oder durch Ausführen von adb install. Der Wiederherstellungsvorgang erfolgt nach der Installation der APK, jedoch bevor die App vom Benutzer gestartet werden kann.
Während des Assistenten für die Ersteinrichtung des Geräts wird dem Benutzer eine Liste der verfügbaren Sicherungsdatensätze angezeigt und er wird gefragt, von welchem die Daten wiederhergestellt werden sollen. Der ausgewählte Sicherungsdatensatz wird zum angestammten Datensatz für das Gerät. Das Gerät kann entweder aus seinen eigenen Backups oder aus dem angestammten Datensatz wiederherstellen. Das Gerät priorisiert sein eigenes Backup, wenn Backups aus beiden Quellen verfügbar sind. Wenn der Benutzer den Gerätesetup-Assistenten nicht durchlaufen hat, kann das Gerät nur aus seinen eigenen Sicherungen wiederherstellen.
Um das Testen zu vereinfachen, enthält Android Tools, mit denen Sie eine Wiederherstellung Ihrer App manuell initiieren können. Weitere Informationen finden Sie unter Testsicherung und -wiederherstellung.
Backup aktivieren und deaktivieren
Apps, die auf Android 6.0 (API Level 23) oder höher abzielen, nehmen automatisch an der automatischen Sicherung teil. Legen Sie in Ihrer App-Manifestdatei den booleschen Wertandroid:allowBackup
fest, um die Sicherung zu aktivieren oder zu deaktivieren. Der Standardwert ist true
aber um Ihre Absichten klar zu machen, empfehlen wir, das Attribut in Ihren unten gezeigten Manifestas explizit festzulegen:
<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>
Sie können Backups deaktivieren, indem Sie android:allowBackup
auf false
. Möglicherweise möchten Sie dies tun, wenn Ihre App ihren Status über einen anderen Mechanismus wiederherstellen kann oder wenn Ihre App vertrauliche Informationen enthält, die Android nicht sichern sollte.
Dateien einschließen und ausschließen
Standardmäßig sichert das System fast alle App-Daten. Weitere Informationen finden Sie unter Dateien, die gesichert werden. In diesem Abschnitt erfahren Sie, wie Sie benutzerdefinierte XML-Regeln definieren, um zu steuern, was gesichert wird.
- Fügen Sie in
AndroidManifest.xml
das Attributandroid:fullBackupContent
zum Element<application>
hinzu. Dieses Attribut verweist auf eine XML-Datei, die Sicherungsregeln enthält. Beispiel:<application ... android:fullBackupContent="@xml/my_backup_rules"></application>
- Erstellen Sie eine XML-Datei mit dem Namen
my_backup_rules.xml
im Verzeichnisres/xml/
. Fügen Sie in der Datei Regeln mit den Elementen<include>
und<exclude>
hinzu.Das folgende Beispiel sichert alle freigegebenen Einstellungen außerdevice.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. Wenn Sie ein <include> -Element angeben, schließt das System standardmäßig keine Dateien mehr ein und sichert nur die angegebenen Dateien. Um mehrere Dateien einzuschließen, verwenden Sie mehrere <include> Elemente.Hinweis: Dateien in Verzeichnissen, die von
getCacheDir()
getCodeCacheDir()
odergetNoBackupFilesDir()
zurückgegeben werden, werden immer ausgeschlossen, auch wenn Sie versuchen, sie einzuschließen. -
<exclude>
– Gibt eine Datei oder einen Ordner an, die/der während der Sicherung ausgeschlossen werden soll. Hier sind einige Dateien, die normalerweise von der Sicherung ausgeschlossen sind:- Dateien mit gerätespezifischen Kennungen, die entweder von einem Server ausgegeben oder auf dem Gerät generiert werden. Beispielsweise muss Google Cloud Messaging (GCM) jedes Mal ein Registrierungstoken generieren, wenn ein Benutzer Ihre App auf einem neuen Gerät installiert. Wenn das alte Registrierungstoken wiederhergestellt wird, verhält sich die App möglicherweise unerwartet.
- Kontoanmeldeinformationen oder andere vertrauliche Informationen. Erwägen Sie, den Benutzer zu bitten, sich beim ersten Start einer wiederhergestellten App erneut zu authentifizieren, anstatt die Speicherung solcher Informationen in der Sicherung zuzulassen.
- Dateien zum Debuggen von Apps.
- Große Dateien, die dazu führen, dass die App das 25-MB-Backup-Kontingent überschreitet.
Hinweis: Wenn Ihre Konfigurationsdatei beide Elemente angibt, enthält die Sicherung alles, was von den <include>
-Elementen erfasst wurde, abzüglich der in den <exclude>
-Elementen genannten Ressourcen. Mit anderen Worten, <exclude>
hat Vorrang.
Jedes Element muss die folgenden zwei Attribute enthalten:
-
domain
– gibt den Speicherort der Ressource an. Gültige Werte für dieses Attribut sind die folgenden:-
root
– das Verzeichnis im Dateisystem, in dem alle privaten Dateien dieser App gespeichert sind. -
file
– vongetFilesDir()
zurückgegebene Verzeichnisse. -
database
– vongetDatabasePath()
zurückgegebene Verzeichnisse. Datenbanken, die mitSQLiteOpenHelper
erstellt wurden, werden hier gespeichert. -
sharedpref
– das Verzeichnis, in demSharedPreferences
gespeichert sind. -
external
das vongetExternalFilesDir()
-
-
path
: Gibt eine Datei oder einen Ordner an, die in die Sicherung aufgenommen oder von dieser ausgeschlossen werden sollen. Beachten Sie Folgendes:- Dieses Attribut unterstützt keine Platzhalter- oder Regex-Syntax.
- Sie können
.
verwenden, um auf das aktuelle Verzeichnis zu verweisen, Sie können jedoch aus Sicherheitsgründen nicht auf das übergeordnete Verzeichnis verweisen..
. - Wenn Sie ein Verzeichnis angeben, gilt die Regel für alle Dateien im Verzeichnis und für rekursive Unterverzeichnisse.
zurückgegebene Verzeichnis Hinweis: Sie können keine Dateien außerhalb dieser Speicherorte sichern.
Das include
-Element kann auch das requireFlags
-Attribut enthalten, das der Abschnitt beschreibt, wie bedingte Anforderungen für definiert werdenbackup Abschnitt diskutiert ausführlicher.
Definieren Sie die für die Sicherung erforderlichen Gerätebedingungen
Wenn Ihre App vertrauliche Informationen auf dem Gerät speichert, können Sie die Bedingungen angeben, unter denen die Daten Ihrer App in die Sicherung des Benutzers aufgenommen werden. Sie können die folgenden Bedingungen in Android 9 (API Level 28) oder höher hinzufügen:
-
clientSideEncryption
: Das Backup des Benutzers wird mit einem Client-Sidesecret verschlüsselt. Diese Form der Verschlüsselung ist auf Geräten mit Android 9 oder höher aktiviert, solange der Benutzer die Sicherung in Android 9 oder höher aktiviert und eine Bildschirmsperre (PIN, Muster oder Kennwort) für sein Gerät festgelegt hat. -
deviceToDeviceTransfer
: Der Benutzer überträgt sein Backup auf ein anderes Gerät, das die lokale Übertragung von Gerät zu Gerät unterstützt (z. B. Google Pixel).
Wenn Sie Ihre Entwicklungsgeräte auf Android 9 aktualisiert haben, müssen Sie die Datensicherung nach dem Upgrade deaktivieren und erneut aktivieren. Dies liegt daran, dass Android Sicherungen nur mit einem clientseitigen Geheimnis verschlüsselt, nachdem Benutzer in den Einstellungen oder im Setup-Assistenten informiert wurden.
Um die Einschlussbedingungen zu deklarieren, setzen Sie das requireFlags
-Attribut auf den gewünschten Wert oder die gewünschten Werte in den <include>
-Elementen in Ihrem Satz vonbackup-Regeln:
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>
Wenn Ihre App ein Schlüssel-Wert-Sicherungssystem implementiert oder wenn Sie selbst einen Backupagent implementieren, können Sie diese bedingten Anforderungen auch auf Ihre Sicherungslogik anwenden, indem Sie einen bitweisen Vergleich zwischen den Transportflags einesBackupDataOutput
Objekts und denFLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
oder FLAG_DEVICE_TO_DEVICE_TRANSFER
flags.
Das folgende Code-Snippet zeigt ein Beispiel für die Verwendung dieser Methode:
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.}
BackupAgent implementieren
Apps, die eine automatische Sicherung implementieren, müssen keine BackupAgent
. Sie können jedoch optional ein benutzerdefiniertes BackupAgent
implementieren. In der Regel gibt es zwei Gründe dafür:
- Sie möchten eine Benachrichtigung über Sicherungsereignisse erhalten, z. B.
onRestoreFinished()
oderonQuotaExceeded(long, long)
. Diese Callback-Methoden werden auch dann ausgeführt, wenn die App nicht ausgeführt wird. - Sie können den Satz von Dateien, die Sie sichern möchten, nicht einfach mit XML-Regeln ausdrücken. In diesen seltenen Fällen können Sie einen BackupAgent implementieren, der
onFullBackup(FullBackupDataOutput)
überschreibt, um das zu speichern, was Sie möchten. Um die Standardimplementierung des Systems beizubehalten, rufen Sie die entsprechende Methode für die Superklasse mitsuper.onFullBackup()
auf.
Wenn Sie einen BackupAgent implementieren, erwartet das System standardmäßig, dass Ihre App eine Schlüssel- / Wertsicherung und -wiederherstellung durchführt. Um stattdessen die dateibasierte automatische Sicherung zu verwenden, legen Sie das Attribut android:fullBackupOnly
im Manifest Ihrer App auf true
fest.
Während der automatischen Sicherungs- und Wiederherstellungsvorgänge startet das System die App in einem eingeschränkten Modus, um zu verhindern, dass die App auf Dateien zugreift, die Konflikte verursachen könnten, und die App Callback-Methoden in ihrer BackupAgent
. In diesem eingeschränkten Modus wird die Hauptaktivität der App nicht automatisch gestartet, ihre Inhaltsanbieter werden nicht initialisiert und die Basisklasse Application
wird anstelle einer im Manifest der App deklarierten Unterklasse instanziiert.
Vorsicht: Um Fehler zu vermeiden, stellen Sie sicher, dass die Teile Ihrer App, die im eingeschränkten Modus ausgeführt werden (hauptsächlich Ihre BackupAgent
), nicht auf Inhaltsanbieter in derselben App zugreifen oder versuchen, das Application
-Objekt umzuwandeln. Wenn Sie diese Muster nicht vermeiden können, sollten Sie die Schlüssel- / Wertsicherung implementieren oder die Sicherung vollständig deaktivieren.
Ihr BackupAgent
muss die abstrakten Methoden onBackup()
und onRestore()
implementieren, die für die Schlüsselwertsicherung verwendet werden. Wenn Sie jedoch keine Schlüsselwertsicherung durchführen möchten, können Sie Ihre Implementierung dieser Methoden einfach leer lassen.
Weitere Informationen finden Sie unter Erweitern von BackupAgent.