Nutzerdaten mit der automatischen Sicherung sichern

Mit der automatischen Sicherung für Apps werden die Daten eines Nutzers aus Apps automatisch gesichert, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind und darauf ausgeführt werden. Android speichert App-Daten, indem sie in Google Drive des Nutzers hochgeladen werden, wo sie durch die Anmeldedaten des Nutzers geschützt sind. Die Sicherung ist auf den Geräten mit Ende-zu-Ende-Verschlüsselung geschützt. die Android 9 oder höher ausführen und dabei die PIN, das Muster oder das Passwort des Geräts eingeben. Jede App kann bis zu 25 MB an Sicherungsdaten pro App-Nutzer zuweisen. Für das Speichern von Sicherungsdaten fallen keine Kosten an. Sie können den Sicherungsprozess in Ihrer App anpassen oder Sicherungen deaktivieren.

Einen Überblick über die Sicherungsoptionen von Android und eine Anleitung dazu, welche Daten finden Sie in der Übersicht über die Datensicherung.

Dateien, die gesichert werden

Standardmäßig werden bei der automatischen Sicherung Dateien in den meisten Verzeichnissen gesichert, die Ihrer App vom System zugewiesen werden:

Bei der automatischen Sicherung werden Dateien in Verzeichnissen ausgeschlossen, die von getCacheDir(), getCodeCacheDir() und getNoBackupFilesDir() zurückgegeben werden. Die an diesen Speicherorten gespeicherten Dateien sind nur vorübergehend erforderlich und werden bewusst 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 ein- und ausschließen.

Speicherort der Sicherung

Die Sicherungsdaten werden in einem privaten Ordner im Google Drive-Konto des Nutzers gespeichert, ist auf 25 MB pro App begrenzt. Die gespeicherten Daten werden nicht auf den privaten Google Drive-Kontingent. Es wird nur die letzte Sicherung gespeichert. Wenn ein gesichert wird, werden alle vorherigen Sicherungen 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 aufrufen, die in Google Drive gesichert wurden Android-App Auf Android-Geräten finden Nutzer diese Liste im Drive- App-Navigationsleiste unter Einstellungen > Sichern und zurücksetzen

Alle Sicherungen, die während der Geräteeinrichtung erstellt wurden, werden in separaten Datasets gespeichert, die in den folgenden Beispielen beschrieben werden:

  • Wenn der Nutzer zwei Geräte hat, gibt es für jedes Gerät ein Sicherungs-Dataset.

  • Wenn der Nutzer ein Gerät auf die Werkseinstellungen zurücksetzt und dann das Gerät mit der wird die Sicherung in einem neuen Dataset gespeichert. Veraltete Datensätze werden nach einer bestimmten Zeit der Inaktivität automatisch gelöscht.

Zeitplan für die Sicherung

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

  • Der Nutzer hat die Sicherung auf dem Gerät aktiviert. In Android 9 finden Sie diese Einstellung unter Einstellungen > System > Sicherung.
  • Seit der letzten Sicherung sind mindestens 24 Stunden vergangen.
  • Das Gerät ist inaktiv.
  • Das Gerät ist mit einem WLAN verbunden (sofern der Nutzer des Geräts keine Sicherungen über mobile Daten aktiviert 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 schaltet das System die App aus, damit keine Daten mehr in das Dateisystem geschrieben werden. Standardmäßig werden vom Sicherungssystem Apps ignoriert, die im Vordergrund ausgeführt werden, um eine schlechte Nutzererfahrung zu vermeiden. Sie können das Standardverhalten überschreiben, indem Sie das Attribut android:backupInForeground auf „wahr“ setzen.

Um das Testen zu vereinfachen, enthält Android Tools, mit denen Sie eine Sicherung Ihrer App manuell starten können. Weitere Informationen finden Sie unter Sicherung und Wiederherstellung testen.

Zeitplan wiederherstellen

Die Daten werden bei jeder Installation der App wiederhergestellt, z. B. aus dem Play Store, bei der Geräteeinrichtung (wenn das System zuvor installierte Apps installiert) oder durch adb-Installation wird ausgeführt. Die Wiederherstellung erfolgt, nachdem das APK installiert wurde bevor die App vom Nutzer gestartet werden kann.

Während des Einrichtungsassistenten für das Gerät wird dem Nutzer eine Liste der verfügbaren Sicherungsdatensätze angezeigt und er wird gefragt, von welchem Datensatz die Daten wiederhergestellt werden sollen. Das ausgewählte Sicherungs-Dataset wird zum Stamm-Dataset für das Gerät. Das Gerät kann entweder aus seinen eigenen Sicherungen oder aus dem ursprünglichen Datensatz wiederhergestellt werden. Wenn Sicherungen von beide Quellen verfügbar sind, priorisiert das Gerät sein eigenes Back-up. Wenn der Nutzer den Einrichtungsassistenten nicht durchlaufen haben, kann das Gerät die Wiederherstellung nur über eigene Back-ups erstellen.

Um das Testen zu vereinfachen, enthält Android Tools, mit denen Sie manuell einen die Wiederherstellung Ihrer App. 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 teil. automatisch sichern. Legen Sie in der Manifestdatei Ihrer App den booleschen Wert android:allowBackup fest, um die Sicherung zu aktivieren oder zu deaktivieren. Der Standardwert ist true, wir empfehlen jedoch, das Attribut explizit in Ihrem Manifest festzulegen, Beispiel:

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

Sie können Sicherungen deaktivieren, indem Sie android:allowBackup auf false setzen. Möglicherweise möchten dies tun, wenn Ihre App ihren Zustand durch einen anderen Mechanismus neu erstellen kann oder wenn es in Ihrer App um sensible Informationen geht.

Dateien ein- und ausschließen

Standardmäßig werden fast alle App-Daten gesichert. Weitere Informationen finden Sie unter im Abschnitt zu gesicherten Dateien.

In diesem Abschnitt erfahren Sie, wie Sie benutzerdefinierte XML-Regeln definieren, um zu steuern, was gesichert wird. Wenn Ihre App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, müssen Sie eine zusätzliche Reihe von XML-Sicherungsregeln angeben, wie in diesem Abschnitt beschrieben, um die Änderungen an der Sicherungswiederherstellung zu unterstützen, die für Geräte mit diesen Android-Versionen eingeführt wurden.

Sicherung unter Android 11 und niedriger steuern

Folge den Schritten in diesem Abschnitt, um festzulegen, welche Dateien auf Geräten gesichert werden sollen mit Android 11 (API-Level 30) oder niedriger.

  1. Fügen Sie in der Datei AndroidManifest.xml den Parameter android:fullBackupContent-Attribut dem <application>-Element hinzu, wie im folgenden Beispiel gezeigt. Dieses Attribut verweist auf eine XML-Datei mit Sicherungsregeln.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. Erstellen Sie eine XML-Datei mit dem Namen @xml/backup_rules in das Verzeichnis res/xml/. Fügen Sie in dieser Datei Regeln mit den <include>- und <exclude>-Elemente. Im folgenden Beispiel werden alle freigegebenen Einstellungen mit Ausnahme von device.xml gesichert:

    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
     <include domain="sharedpref" path="."/>
     <exclude domain="sharedpref" path="device.xml"/>
    </full-backup-content>

Für die Sicherung erforderliche Gerätebedingungen definieren

Wenn deine App vertrauliche Daten auf dem Gerät speichert, kannst du Bedingungen, unter denen die Daten Ihrer App in das Back-up des Nutzers aufgenommen werden. Unter Android 9 (API-Level 28) oder höher können Sie die folgenden Bedingungen hinzufügen:

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 nur Android verschlüsselt Sicherungen mit einem clientseitigen Secret, nachdem der Nutzer in den Einstellungen oder den Einrichtungsassistenten.

Um die Einschlussbedingungen zu deklarieren, setzen Sie das Attribut requireFlags auf einen ausgewählten Wert oder Werte in den <include>-Elementen innerhalb des Satzes Backups Regeln:

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 in Ihrer App ein Schlüssel/Wert-Back-up-System implementiert ist oder Sie BackupAgent selbst können Sie diese bedingten Anforderungen auch anwenden zu Ihrer Backup-Logik hinzufügen, indem Sie einen bitweisen Vergleich zwischen einer Den Satz von Transport-Flags des Objekts BackupDataOutput und Ihre benutzerdefinierte Sicherung FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED oder des Kundenservicemitarbeiters FLAG_DEVICE_TO_DEVICE_TRANSFER-Flags.

Das folgende Code-Snippet zeigt ein Beispiel für die Verwendung dieser Methode:

Kotlin

class CustomBackupAgent : 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 CustomBackupAgent 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.
}

Sicherung unter Android 12 oder höher steuern

Wenn deine App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, folge der Anleitung unter können Sie festlegen, welche Dateien auf aktiven Geräten Android 12 oder höher.

  1. Fügen Sie in der Datei AndroidManifest.xml den Parameter Attribut android:dataExtractionRules zu <application> -Element wie im folgenden Beispiel gezeigt. Dieses Attribut verweist auf eine XML-Datei mit Sicherungsregeln.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. Erstellen Sie im Verzeichnis res/xml/ eine XML-Datei mit dem Namen backup_rules.xml. Fügen Sie in dieser Datei Regeln mit den <include>- und <exclude>-Elemente. Im folgenden Beispiel werden alle freigegebenen Einstellungen mit Ausnahme von device.xml gesichert:

    <?xml version="1.0" encoding="utf-8"?>
    <data-extraction-rules>
     <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
       <include domain="sharedpref" path="."/>
       <exclude domain="sharedpref" path="device.xml"/>
     </cloud-backup>
    </data-extraction-rules>

Syntax der XML-Konfiguration

Die XML-Syntax für die Konfigurationsdatei variiert je nach Version des Android, auf das deine App ausgerichtet ist und auf dem sie ausgeführt wird.

Android 11 oder niedriger

Verwenden Sie die folgende XML-Syntax für die Konfigurationsdatei, die die Sicherung für Geräte mit Android 11 oder niedriger.

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"
    requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string" />
</full-backup-content>

Android 12 oder höher

Wenn deine App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, verwende den folgenden XML-Code Syntax für die Konfigurationsdatei, die die Sicherung für ausgeführte Geräte steuert Android 12 oder höher

<data-extraction-rules>
  <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
  </cloud-backup>
  <device-transfer>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
  </device-transfer>
</data-extraction-rules>

Jeder Abschnitt der Konfiguration (<cloud-backup>, <device-transfer>) enthält Regeln, die nur für diese Art von Übertragung gelten. Durch diese Trennung können Sie z. B. eine Datei oder ein Verzeichnis aus Google Drive-Sicherungen ausschließen, während der Übertragung zwischen Gerät zu Gerät (D2D) übertragen wird. Dies ist nützlich, wenn Sie haben Dateien, die zu groß für die Sicherung in der Cloud sind, aber übertragen werden können problemlos zwischen Geräten wechseln.

Wenn es für einen bestimmten Sicherungsmodus keine Regeln gibt, Abschnitt „<device-transfer>“ fehlt. Dieser Modus ist für alle aktiviert. mit Ausnahme der Verzeichnisse no-backup und cache, wie in den Bereich Gesicherte Dateien.

Deine App kann das disableIfNoEncryptionCapabilities-Flag im <cloud-backup>, um sicherzustellen, dass die Sicherung nur durchgeführt wird, wenn es möglich ist verschlüsselt, z. B. wenn der Nutzer einen Sperrbildschirm hat. Wenn Sie diese Einschränkung festlegen, werden keine Sicherungen an die Cloud gesendet, wenn das Gerät des Nutzers keine Verschlüsselung unterstützt. Da D2D-Übertragungen nicht an den Server gesendet werden, funktionieren sie auch auf Geräten, die keine Verschlüsselung unterstützen.

Syntax für ein- und auszuschließende Elemente

Innerhalb der <full-backup-content>-, <cloud-backup>- und <device-transfer>-Tags können Sie (je nach Android-Version des Geräts und targetSDKVersion Ihrer App) <include>- und <exclude>-Elemente definieren:

<include>

Gibt eine Datei oder einen Ordner an, der gesichert werden soll. Standardmäßig ist die automatische Sicherung enthält fast alle App-Dateien. Wenn Sie ein <include>-Element angeben, das System standardmäßig keine Dateien mehr hinzufügt, und sichert nur nur die Dateien angegeben. Wenn Sie mehrere Dateien einschließen möchten, verwenden Sie mehrere <include>-Elemente.

Unter Android 11 und niedriger kann dieses Element auch den Parameter requireFlags-Attribut. Dieser Abschnitt enthält eine Definition wird ausführlicher erläutert.

Dateien in Verzeichnissen, die von getCacheDir(), getCodeCacheDir() oder getNoBackupFilesDir() zurückgegeben werden, werden immer ausgeschlossen, auch wenn Sie versuchen, sie einzubeziehen.

<exclude>

Gibt eine Datei oder einen Ordner an, die bzw. der während der Sicherung ausgeschlossen werden soll. Hier sind einige Dateien, die normalerweise von der Sicherung ausgeschlossen sind:

  • Dateien mit gerätespezifischen IDs, die entweder von einem Server ausgestellt werden oder auf dem Gerät generiert werden. Beispielsweise muss Firebase Cloud Messaging (FCM) jedes Mal ein Registrierungstoken generieren, wenn ein Nutzer Ihre App auf einem neuen Gerät installiert. Wenn das alte Registrierungstoken wiederhergestellt wurde, verhält sich die App möglicherweise unerwartet.

  • Dateien zum Debugging von Apps.

  • Große Dateien, durch die die Anwendung das Sicherungskontingent von 25 MB überschreitet

Jedes <include>- und <exclude>-Element muss die folgenden beiden Attribute enthalten:

domain

Gibt den Speicherort der Ressource an. Gültige Werte für dieses Attribut sind:

  • root: das Verzeichnis im Dateisystem, in dem alle privaten Dateien enthalten sind die zu dieser App gehören, gespeichert sind.
  • file: von getFilesDir() zurückgegebene Verzeichnisse
  • database: Verzeichnisse, die von getDatabasePath() zurückgegeben werden. Datenbanken mit SQLiteOpenHelper erstellte Dateien werden hier gespeichert.
  • sharedpref: das Verzeichnis, in dem SharedPreferences gespeichert ist.
  • external: das von getExternalFilesDir() zurückgegebene Verzeichnis.
  • device_root: Wie root, aber für den gerätegeschützten Speicher.
  • device_file: wie file, aber für den gerätegeschützten Speicher
  • device_database: wie database, aber für den gerätegeschützten Speicher
  • device_sharedpref: wie sharedpref, aber für das gerätegeschützte Gerät Speicherplatz.
path

Gibt eine Datei oder einen Ordner an, die bzw. der in die Sicherung aufgenommen oder von ihr ausgeschlossen werden soll. Hinweis Folgendes:

  • Dieses Attribut unterstützt weder die Syntax für Platzhalter noch für reguläre Ausdrücke.
  • Sie können mit ./ auf das aktuelle Verzeichnis verweisen, aber aus Sicherheitsgründen nicht auf das übergeordnete Verzeichnis, z. B. mit ...
  • Wenn Sie ein Verzeichnis angeben, gilt die Regel für alle Dateien im Verzeichnis und für alle rekursiven Unterverzeichnisse.

BackupAgent implementieren

Für Apps, in denen die automatische Sicherung implementiert wird, muss kein BackupAgent implementiert werden. Sie können jedoch optional eine benutzerdefinierte BackupAgent implementieren. In der Regel gibt es zwei Gründe dafür:

  • Sie möchten Benachrichtigungen zu Sicherungsereignissen wie onRestoreFinished() und onQuotaExceeded(long, long) erhalten. Diese Callback-Methoden werden ausgeführt, auch wenn die App nicht ausgeführt wird.

  • Sie können die Dateien, die Sie sichern möchten, nicht einfach mit XML-Regeln angeben. In diesen seltenen Fällen können Sie eine BackupAgent implementieren, die onFullBackup(FullBackupDataOutput) überschreibt, um die gewünschten Daten zu speichern. Wenn Sie die Standardimplementierung des Systems beibehalten möchten, rufen Sie die entsprechende Methode der Superklasse mit super.onFullBackup() auf.

Wenn Sie eine BackupAgent implementieren, erwartet das System standardmäßig, dass Ihre App Schlüssel/Wert-Paare sichert und wiederherstellt. So verwenden Sie die dateibasierte automatische Sicherung setzen Sie stattdessen das Attribut android:fullBackupOnly auf true in Ihrem App-Manifests.

Während der automatischen Sicherung und Wiederherstellung startet das System die App im eingeschränkten Modus, um zu verhindern, dass die App auf Dateien zugreift, die zu Konflikten führen könnten, und damit die App Rückrufmethoden in ihrer BackupAgent ausführen kann. 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.

Ihr BackupAgent muss die abstrakten Methoden onBackup() implementieren und onRestore(): Diese werden für die Sicherung von Schlüssel/Wert-Paaren verwendet. Wenn Sie keine Schlüssel/Wert-Paare zu sichern, können Sie die Implementierung dieser Methoden leer.

Weitere Informationen finden Sie unter BackupAgent erweitern.