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. Auf Geräten mit Android 9 oder höher wird die Sicherung mit der PIN, dem Muster oder dem Passwort des Geräts Ende-zu-Ende verschlüsselt. Jede App kann bis zu 25 MB 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.

Eine Übersicht über die Sicherungsoptionen von Android und eine Anleitung dazu, welche Daten gesichert und wiederhergestellt werden sollten, finden Sie unter Datensicherungen – Übersicht.

Gesicherte Dateien

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

Dateien in Verzeichnissen, die von getCacheDir(), getCodeCacheDir() und getNoBackupFilesDir() zurückgegeben wurden, werden von der automatischen Sicherung ausgeschlossen. 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

Sicherungsdaten werden in einem privaten Ordner im Google Drive-Konto des Nutzers gespeichert, der auf 25 MB pro Anwendung beschränkt ist. Die gespeicherten Daten werden nicht auf das persönliche Google Drive-Kontingent des Nutzers angerechnet. Es wird nur die letzte Sicherung gespeichert. Wenn eine Sicherung erstellt wird, werden alle vorherigen Sicherungen gelöscht. Die Sicherungsdaten können nicht vom Nutzer oder von anderen Apps auf dem Gerät gelesen werden.

Nutzer können eine Liste der Apps aufrufen, die in der Google Drive App für Android gesichert wurden. Auf einem Android-Gerät finden sie diese Liste in der Navigationsleiste der Drive App unter Einstellungen > Sichern und zurücksetzen.

Back-ups aus jeder Lebensdauer der Geräteeinrichtung werden in separaten Datensätzen gespeichert, wie in den folgenden Beispielen beschrieben:

  • Wenn der Nutzer zwei Geräte besitzt, ist für jedes Gerät ein Sicherungs-Dataset vorhanden.

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

Zeitplan für die Sicherung

Sicherungen erfolgen automatisch, wenn alle folgenden Bedingungen erfüllt sind:

  • Der Nutzer hat die Sicherung auf dem Gerät aktiviert. Unter 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. Es kann jedoch vorkommen, dass ein Gerät nie gesichert wird (z. B. wenn es nie mit einem Netzwerk verbunden ist). Um Netzwerkbandbreite zu sparen, wird der Upload nur durchgeführt, wenn sich die Anwendungsdaten geändert haben.

Während der automatischen Sicherung fährt das System die App herunter, um sicherzustellen, dass 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 für die Wiederherstellung

Die Daten werden bei jeder Installation der App wiederhergestellt, entweder über den Play Store, während der Geräteeinrichtung (wenn das System zuvor installierte Apps installiert) oder indem die adb-Installation ausgeführt wird. Die Wiederherstellung erfolgt nach der Installation des APK, aber bevor die App vom Nutzer gestartet werden kann.

Während des Assistenten für die Ersteinrichtung des Geräts wird dem Nutzer eine Liste der verfügbaren Sicherungs-Datasets angezeigt und er wird gefragt, aus welchem Dataset 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 Back-ups aus beiden Quellen verfügbar sind, priorisiert das Gerät sein eigenes Back-up. Wenn der Nutzer den Einrichtungsassistenten für das Gerät nicht durchlaufen hat, kann das Gerät nur aus seinen eigenen Sicherungen wiederhergestellt werden.

Um die Tests zu vereinfachen, enthält Android Tools, mit denen Sie die Wiederherstellung Ihrer App manuell starten 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 am automatischen Back-up teil. 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, wie im folgenden Beispiel gezeigt:

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

Sie können Sicherungen deaktivieren, indem Sie android:allowBackup auf false setzen. Das kann sinnvoll sein, wenn Ihr App-Status durch einen anderen Mechanismus wiederhergestellt werden kann oder wenn Ihre App vertrauliche Daten verarbeitet.

Dateien ein- und ausschließen

Standardmäßig sichert das System fast alle App-Daten. Weitere Informationen finden Sie 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

Folgen Sie der Anleitung in diesem Abschnitt, um festzulegen, welche Dateien auf Geräten mit Android 11 (API-Level 30) oder niedriger gesichert werden.

  1. Fügen Sie in der Datei AndroidManifest.xml dem Element <application> das Attribut android:fullBackupContent 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 im Verzeichnis res/xml/ eine XML-Datei mit dem Namen @xml/backup_rules. Fügen Sie in dieser Datei Regeln mit den Elementen <include> und <exclude> hinzu. 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 Ihre App vertrauliche Daten auf dem Gerät speichert, können Sie Bedingungen festlegen, unter denen die Daten Ihrer App in der Sicherung des Nutzers enthalten sind. Ab Android 9 (API-Level 28) kannst du 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 Android Sicherungen erst dann mit einem clientseitigen Secret verschlüsselt, nachdem die Nutzer in den Einstellungen oder im Einrichtungsassistenten darüber informiert wurden.

Um die Einschlussbedingungen zu deklarieren, setzen Sie das Attribut requireFlags auf einen oder mehrere ausgewählte Werte in den <include>-Elementen innerhalb Ihres Satzes von Sicherungsregeln:

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 Sicherungssystem für Schlüssel/Wert-Paare implementiert oder Sie BackupAgent selbst implementieren, können Sie diese bedingten Anforderungen auch auf Ihre Sicherungslogik anwenden. Führen Sie dazu einen bitweisen Vergleich zwischen den Transport-Flags eines BackupDataOutput-Objekts und den Flags FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED oder FLAG_DEVICE_TO_DEVICE_TRANSFER Ihres benutzerdefinierten Sicherungs-Agents durch.

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 Ihre App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, folgen Sie der Anleitung in diesem Abschnitt, um festzulegen, welche Dateien auf Geräten mit Android 12 oder höher gesichert werden.

  1. Fügen Sie in der Datei AndroidManifest.xml dem Element <application> das Attribut android:dataExtractionRules hinzu, 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 Elementen <include> und <exclude> hinzu. 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>
    

XML-Konfigurationssyntax

Die XML-Syntax für die Konfigurationsdatei hängt von der Android-Version ab, auf die Ihre App ausgerichtet ist und auf der sie ausgeführt wird.

Android 11 oder niedriger

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

<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 Ihre App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, verwenden Sie die folgende XML-Syntax für die Konfigurationsdatei, die die Sicherung für Geräte mit Android 12 oder höher steuert.

<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 der Übertragung gelten. So können Sie beispielsweise eine Datei oder ein Verzeichnis aus Google Drive-Sicherungen ausschließen, sie aber bei Übertragungen zwischen Geräten (Device-to-Device, D2D) trotzdem übertragen. Das ist nützlich, wenn Sie Dateien haben, die zu groß für die Sicherung in der Cloud sind, aber problemlos zwischen Geräten übertragen werden können.

Wenn für einen bestimmten Sicherungsmodus keine Regeln vorhanden sind, z. B. wenn der Abschnitt <device-transfer> fehlt, ist dieser Modus für alle Inhalte aktiviert, mit Ausnahme der Verzeichnisse no-backup und cache, wie im Abschnitt Gesicherte Dateien beschrieben.

Ihre Anwendung kann das Flag disableIfNoEncryptionCapabilities im Abschnitt <cloud-backup> festlegen, damit die Sicherung nur dann erfolgt, wenn sie verschlüsselt werden kann, 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 werden bei der automatischen Sicherung fast alle App-Dateien berücksichtigt. Wenn Sie ein <include>-Element angeben, werden im System standardmäßig keine Dateien mehr aufgenommen und es werden nur die angegebenen Dateien gesichert. Wenn Sie mehrere Dateien angeben möchten, verwenden Sie mehrere <include>-Elemente.

Unter Android 11 und niedriger kann dieses Element auch das Attribut requireFlags enthalten. Weitere Informationen finden Sie im Abschnitt zum Definieren von bedingten Anforderungen für die Sicherung.

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, der bei der Sicherung ausgeschlossen werden soll. Hier sind einige Dateien, die normalerweise von der Sicherung ausgeschlossen werden:

  • Dateien mit gerätespezifischen IDs, die entweder von einem Server ausgestellt oder auf dem Gerät generiert wurden. Firebase Cloud Messaging (FCM) muss beispielsweise jedes Mal ein Registrierungstoken generieren, wenn ein Nutzer Ihre App auf einem neuen Gerät installiert. Wenn das alte Registrierungstoken wiederhergestellt wird, kann es zu unerwartetem Verhalten der App kommen.

  • 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 dieser App gespeichert werden.
  • file: Verzeichnisse, die von getFilesDir() zurückgegeben werden.
  • database: von getDatabasePath() zurückgegebene Verzeichnisse Hier werden mit SQLiteOpenHelper erstellte Datenbanken 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: Ähnlich wie file, aber für den gerätegeschützten Speicher.
  • device_database: Ähnlich wie database, aber für den gerätegeschützten Speicher.
  • device_sharedpref: Wie sharedpref, aber für den gerätegeschützten Speicher.
path

Gibt eine Datei oder einen Ordner an, der in die Sicherung ein- oder daraus ausgeschlossen werden soll. Wichtige Hinweise:

  • Für dieses Attribut werden keine Platzhalter oder regulären Ausdrücke unterstützt.
  • 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

Bei Apps, die die automatische Sicherung implementieren, muss keine BackupAgent implementiert werden. Optional können Sie jedoch eine benutzerdefinierte BackupAgent implementieren. Dafür gibt es in der Regel zwei Gründe:

  • Sie möchten Benachrichtigungen zu Sicherungsereignissen wie onRestoreFinished() und onQuotaExceeded(long, long) erhalten. Diese Callback-Methoden werden auch dann ausgeführt, 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 ein BackupAgent implementieren, das onFullBackup(FullBackupDataOutput) zum Speichern der gewünschten Werte überschreibt. Um die Standardimplementierung des Systems beizubehalten, rufen Sie die entsprechende Methode für die Basisklasse mit super.onFullBackup() auf.

Wenn Sie eine BackupAgent implementieren, erwartet das System standardmäßig, dass Ihre App Schlüssel/Wert-Paare sichert und wiederherstellt. Wenn Sie stattdessen die dateibasierte automatische Sicherung verwenden möchten, legen Sie im Manifest Ihrer App das Attribut android:fullBackupOnly auf true fest.

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 Callback-Methoden 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.

Ihre BackupAgent muss die abstrakten Methoden onBackup() und onRestore() implementieren, die für die Sicherung von Schlüssel/Wert-Paaren verwendet werden. Wenn Sie keine Sicherung der Schlüssel/Wert-Paare vornehmen möchten, können Sie die Implementierung dieser Methoden leer lassen.

Weitere Informationen finden Sie unter BackupAgent erweitern.