Benutzerdaten mit Auto Backup sichern

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 laufen. Android bewahrt die App-Daten, indem es sie in das Google Drive des Nutzers hochlädt, wo sie durch die Anmeldedaten des Google-Kontos des Nutzers geschützt sind. Die Datenmenge ist auf 25 MB pro Nutzer Ihrer App begrenzt und die Speicherung der Sicherungsdaten ist kostenlos. Ihre App kann den Sicherungsprozess individuell anpassen oder die Sicherung deaktivieren.

Einen Überblick über die Sicherungsoptionen von Android und Hinweise dazu, welche Daten Sie sichern und wiederherstellen sollten, finden Sie in der Übersicht zur Datensicherung.

Dateien, die gesichert werden

Standardmäßig umfasst die automatische Sicherung Dateien in den meisten Verzeichnissen, die Ihrer App vom System zugewiesen werden:

  • Gemeinsame Einstellungsdateien.
  • Dateien, die im internen Speicher der App gespeichert sind und auf die über getFilesDir() oder getDir(String, int) zugegriffen wird.
  • Dateien in dem von getDatabasePath(String) zurückgegebenen Verzeichnis, das auch Dateien enthält, die mit der Klasse SQLiteOpenHelper erstellt wurden.
  • Dateien auf externem Speicher in dem Verzeichnis, das von getExternalFilesDir(String) zurückgegeben wird.

Die automatische Sicherung schließt Dateien in Verzeichnissen aus, die von getCacheDir()getCodeCacheDir() oder getNoBackupFilesDir() zurückgegeben werden. Die an diesen Orten gespeicherten Dateien werden nur vorübergehend benötigt oder sind absichtlich von den Sicherungsvorgängen ausgeschlossen.

Sie können Ihre Anwendung so konfigurieren, dass bestimmte Dateien ein- und ausgeschlossen werden. Weitere Informationen finden Sie im Abschnitt Dateien ein- und ausschließen.

Hinweis: Android behandelt die Konfiguration von Komponenten nicht als Benutzerdaten. Wenn Ihre App bestimmte Komponenten in ihrem Manifest aktiviert oder deaktiviert, während sie läuft, erwarten Sie nicht, dass AutoBackup die Konfiguration speichert und wiederherstellt. Um den Konfigurationsstatus zu erhalten, speichern Sie ihn in den Gemeinsamen Einstellungen und stellen Sie die Gemeinsamen Einstellungen bei der Wiederherstellung wieder her. Wenn Sie möchten, dass Ihre Anwendung ihren Status speichert, speichern Sie den Status in den Gemeinsamen Einstellungen und stellen Sie die Gemeinsamen Einstellungen bei der Wiederherstellung wieder her.

Sicherungsort

Die Sicherungsdaten werden in einem privaten Ordner im Google Drive-Konto des Nutzers gespeichert und sind auf 25 MB pro Anwendung begrenzt. Die gespeicherten Daten werden nicht auf das persönliche Google Drive-Kontingent des Nutzers angerechnet. Es wird nur die aktuellste Sicherung gespeichert. Wenn ein Backup erstellt wird, wird das vorherige Backup (falls vorhanden) gelöscht. Die Sicherungsdaten können weder vom Nutzer noch von anderen Apps auf dem Gerät gelesen werden.

Nutzer können eine Liste der Apps, die gesichert wurden, in der Google DriveAndroid-App sehen. Auf einem Android-Gerät finden Nutzer diese Liste in der Navigationsschublade der Drive-App unter Einstellungen > Sichern und Zurücksetzen > App-Daten.

Sicherungen von jedem Gerät werden in separaten Datensätzen gespeichert, wie in den folgenden Beispielen gezeigt wird:

  • Wenn der Nutzer zwei Geräte besitzt, dann existiert für jedes Gerät ein Sicherungsdatensatz.
  • Wenn der Benutzer ein Gerät werkseitig zurücksetzt und dann das Gerät mit demselben Konto einrichtet, wird die Sicherung in einem neuen Datensatz gespeichert. Veraltete Datasets werden nach einer gewissen Zeit der Inaktivität automatisch gelöscht.

Backup-Zeitplan

Backups werden automatisch durchgeführt, wenn alle der folgenden Bedingungen erfüllt sind:

  • Der Benutzer hat das Backup auf dem Gerät aktiviert. In Android 9 befindet sich diese Einstellung inEinstellungen > System >Sicherung.
  • Seit der letzten Sicherung sind mindestens 24 Stunden vergangen.
  • Das Gerät ist im Leerlauf.
  • Das Gerät ist mit einem Wi-Fi-Netzwerk verbunden (wenn der Benutzer des Geräts nicht für mobile Datensicherungen optiert hat).

In der Praxis treten diese Bedingungen ungefähr jede Nacht auf, aber ein Gerät wird möglicherweise nie gesichert (z. B. wenn es sich nie mit einem Netzwerk verbindet). Um die Netzwerkbandbreite 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 Backup-System Anwendungen, die im Vordergrund ausgeführt werden, da die Benutzer das Herunterfahren ihrer Anwendungen bemerken würden. Sie können das Standardverhalten außer Kraft setzen, indem Sie das backupInForeground-Attribut 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 Sicherung und Wiederherstellung testen.

Zeitplan für die Wiederherstellung

Daten werden immer dann wiederhergestellt, wenn die App installiert wird, entweder aus dem Play Store, während der Einrichtung des Geräts (wenn das System zuvor installierte Apps installiert) oder durch Ausführen von adb install. Der Wiederherstellungsvorgang erfolgt nach der Installation der APK, aber bevor die App vom Benutzer gestartet werden kann.

Während des Assistenten zur Ersteinrichtung des Geräts wird dem Benutzer eine Liste der verfügbaren Sicherungsdatensätze angezeigt und er wird gefragt, von welchem er die Daten wiederherstellen möchte. Der ausgewählte Sicherungsdatensatz wird zum Stammdatensatz für das Gerät. Das Gerät kann entweder aus seinen eigenen Sicherungen oder aus dem angestammten Datensatz wiederherstellen. Das Gerät bevorzugt seine eigene Sicherung, wenn Sicherungen aus beiden Quellen verfügbar sind. Wenn der Benutzer den Assistenten für die Geräteeinrichtung 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 Anwendung manuell initiieren können. Weitere Informationen finden Sie unter Sicherung und Wiederherstellung testen.

Sicherung aktivieren und deaktivieren

Apps, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind, nehmen automatisch an der automatischen Sicherung teil. Setzen Sie in der Manifestdatei Ihrer App den booleschen Wertandroid:allowBackup, um das Backup zu aktivieren oder zu deaktivieren. Der Standardwert ist true, aber um Ihre Absichten zu verdeutlichen, empfehlen wir, das Attribut explizit in Ihrem Manifest zu setzen, wie unten gezeigt:

<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>

Sie können Backups deaktivieren, indem Sie android:allowBackup auf false setzen. Dies kann sinnvoll sein, wenn Ihre App ihren Zustand durch einen anderen Mechanismus wiederherstellen kann oder wenn Ihre App mit sensiblen Informationen arbeitet, 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.

  1. Fügen Sie in AndroidManifest.xml das Attribut android:fullBackupContent zum Element <application> hinzu. Dieses Attribut verweist auf eine XML-Datei, die Sicherungsregeln enthält. For example:
    <application ... android:fullBackupContent="@xml/my_backup_rules"></application>
  2. 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. Um mehrere Dateien einzuschließen, verwenden Sie mehrere <include>-Elemente.

    Hinweis: Dateien in Verzeichnissen, die von getCacheDir()getCodeCacheDir() oder getNoBackupFilesDir() zurückgegeben werden, sind immer ausgeschlossen, auch wenn Sie versuchen, sie einzuschließen.

  • <exclude> – Gibt eine Datei oder einen Ordner an, der bei der Sicherung ausgeschlossen werden soll. Hier sind einige Dateien, die normalerweise von der Sicherung ausgeschlossen werden:
    • Dateien mit gerätespezifischen Kennungen, die entweder von einem Server ausgegeben oder auf dem Gerät erzeugt werden. Google Cloud Messaging (GCM) muss zum Beispiel jedes Mal ein Registrierungs-Token generieren, wenn ein Nutzer Ihre App auf einem neuen Gerät installiert. Wenn das alte Registrierungs-Token wiederhergestellt wird, kann die App ein unerwartetes Verhalten zeigen.
    • Kontozugangsdaten oder andere sensible Informationen. Erwägen Sie, den Benutzer aufzufordern, sich beim ersten Start einer wiederhergestellten Anwendung erneut zu authentifizieren, anstatt die Speicherung solcher Informationen im Backup zuzulassen.
    • Dateien für die Fehlersuche in der Anwendung.
    • 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 by getFilesDir().
    • database – directories returned by getDatabasePath(). Databases created with SQLiteOpenHelper are stored here.
    • sharedpref – the directory where SharedPreferences are stored.
    • external the directory returned by getExternalFilesDir()
  • Note: You cannot back up files outside of these locations.

  • 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.

The include element can also contain the requireFlags attribute, which thesection describing how to define conditional requirements forbackup section discusses in more detail.

Gerätebedingungen für das Backup festlegen

Wenn Ihre App sensible Informationen auf dem Gerät speichert, können Sie Bedingungen festlegen, unter denen die Daten Ihrer App in das Backup 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-Side-Secret verschlüsselt. Diese Form der Verschlüsselung ist auf Geräten mit Android 9 oder höher aktiviert, sofern der Benutzer die Datensicherung in Android 9 oder höher aktiviert und eine Bildschirmsperre (PIN, Muster oder Passwort) für sein Gerät festgelegt hat.
  • deviceToDeviceTransfer: Der Benutzer überträgt seine Datensicherung 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 dann wieder aktivieren. Das liegt daran, dass Android Backups nur mit einem clientseitigen Geheimnis verschlüsselt, nachdem die Benutzer in den Einstellungen oder im Einrichtungsassistenten darüber informiert wurden.

Um die Einschlussbedingungen zu deklarieren, setzen Sie das requireFlags-Attribut auf den/die gewünschten Wert(e) in den <include>-Elementen innerhalb Ihres Satzes von Backup-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 Anwendung ein Key-Value-Backupsystem implementiert, oder wenn SieBackupAgent selbst implementieren,können Sie diese bedingten Anforderungen auch auf Ihre Sicherungslogik anwenden, indem Sie einen bitweisen Vergleich zwischen einemBackupDataOutput Objektsatz von Transportflags und denFLAG_CLIENT_SIDE_ENCRYPTION_ENABLED oder FLAG_DEVICE_TO_DEVICE_TRANSFERFlags Ihres benutzerdefinierten Sicherungsagenten durchführen.

Der folgende Codeschnipsel 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.}

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() or onQuotaExceeded(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 with super.onFullBackup().

If you implement a BackupAgent, by default the system expects your app to perform key/value backup and restore. Um stattdessen das dateibasierte Auto-Backup zu verwenden, setzen Sie das android:fullBackupOnly-Attribut im Manifest Ihrer App auf true.

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 um die App Callback-Methoden in ihrem BackupAgent ausführen zu lassen. 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.

Achtung: Um Fehler zu vermeiden, stellen Sie sicher, dass die Teile Ihrer App, die im eingeschränkten Modus ausgeführt werden (hauptsächlich Ihr BackupAgent), nicht auf Inhaltsanbieter in derselben App zugreifen oder versuchen, das Application-Objekt zu casten. Wenn Sie diese Muster nicht vermeiden können, sollten Sie in Erwägung ziehen, Key/Value-Backup zu implementieren oder das Backup ganz zu deaktivieren.

Ihr BackupAgent muss die abstrakten Methoden onBackup() und onRestore() implementieren, die für das Key-Value-Backup verwendet werden. Wenn Sie jedoch kein Key-Value-Backup durchführen möchten, können Sie Ihre Implementierung dieser Methoden einfach leer lassen.

Weitere Informationen finden Sie unter Erweiterung von BackupAgent.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.