Nutzerdaten mit der automatischen Sicherung sichern

Mit der automatischen Sicherung für Apps werden die Daten eines Nutzers aus Apps, die auf Android 6.0 (API-Level 23) oder höher ausgerichtet sind und ausgeführt werden, automatisch gesichert. Android behält die App-Daten bei, indem sie in Google Drive des Nutzers hochgeladen werden. Dort werden sie durch die Anmeldedaten des Google-Kontos des Nutzers geschützt. Die Sicherung wird auf Geräten mit Android 9 oder höher mit Ende-zu-Ende-Verschlüsselung geschützt. Dabei wird die PIN, das Muster oder das Passwort des Geräts verwendet. Die Datenmenge ist auf 25 MB pro Nutzer beschränkt. Für das Speichern von Sicherungsdaten fallen keine Kosten an. Ihre Anwendung kann den Sicherungsprozess anpassen oder die Funktion durch Deaktivieren von Sicherungen deaktivieren.

Eine Übersicht über die Sicherungsoptionen von Android und eine Anleitung dazu, welche Daten gesichert und wiederhergestellt werden sollten, finden Sie in der Übersicht zur Datensicherung.

Dateien, die gesichert werden

Standardmäßig schließt die automatische Sicherung Dateien in den meisten Verzeichnissen ein, die Ihrer Anwendung vom System zugewiesen wurden:

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

Sie können Ihre App so konfigurieren, dass bestimmte Dateien ein- oder 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. Dieser ist auf 25 MB pro Anwendung begrenzt. Die gespeicherten Daten werden nicht auf das persönliche Google Drive-Kontingent des Nutzers angerechnet. Nur die letzte Sicherung wird gespeichert. Wenn eine Sicherung erstellt wird, werden alle vorherigen Sicherungen gelöscht. Die Sicherungsdaten können vom Nutzer oder von anderen Apps auf dem Gerät nicht gelesen werden.

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

Sicherungen für die einzelnen Lebensdauer der Geräteeinrichtung werden in separaten Datasets gespeichert, wie in den folgenden Beispielen beschrieben:

  • Wenn der Nutzer zwei Geräte besitzt, ist für jedes Gerät ein Sicherungsdatensatz 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 Dataset gespeichert. Veraltete Datasets werden nach einer bestimmten Zeit der Inaktivität automatisch gelöscht.

Zeitplan für die Sicherung

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

  • Der Nutzer hat die Sicherung auf dem Gerät aktiviert. In Android 9 befindet sich diese Einstellung in 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 (wenn der Gerätenutzer die Sicherung von mobilen Daten nicht aktiviert hat).

In der Praxis treten diese Bedingungen etwa jede Nacht auf. Es kann jedoch vorkommen, dass ein Gerät niemals Daten sichert (z. B. wenn es nie mit einem Netzwerk verbunden ist). Um Netzwerkbandbreite zu schonen, erfolgt der Upload nur, wenn sich die Anwendungsdaten geändert haben.

Während der automatischen Sicherung fährt das System die Anwendung herunter, damit sie nicht mehr in das Dateisystem schreibt. Apps, die im Vordergrund ausgeführt werden, werden vom Sicherungssystem standardmäßig ignoriert, um eine schlechte Nutzererfahrung zu vermeiden. Sie können das Standardverhalten überschreiben, indem Sie das Attribut android:backupInForeground auf „true“ setzen.

Android enthält Tools, mit denen du die Sicherung deiner App manuell starten kannst, um das Testen zu vereinfachen. Weitere Informationen findest du unter Sicherung und Wiederherstellung testen.

Wiederherstellungszeitplan

Die Daten werden bei jeder Installation der App wiederhergestellt, sei es aus dem Play Store, während der Geräteeinrichtung (wenn das System zuvor installierte Apps installiert) oder durch Ausführen der adb-Installation. Die Wiederherstellung erfolgt nach der Installation des APKs, aber bevor die App für den Nutzer verfügbar ist.

Im 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 übergeordneten Dataset für das Gerät. Das Gerät kann entweder aus seinen eigenen Sicherungen oder dem Ancestor-Dataset wiederhergestellt werden. Wenn Sicherungen aus beiden Quellen verfügbar sind, priorisiert das Gerät seine eigene Sicherung. Wenn der Nutzer den Assistenten für die Geräteeinrichtung nicht ausgeführt hat, kann das Gerät nur aus seinen eigenen Sicherungen wiederhergestellt werden.

Android enthält Tools, mit denen Sie die Wiederherstellung Ihrer App manuell starten können, um das Testen zu vereinfachen. Weitere Informationen finden Sie unter Sichern und Wiederherstellen 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. 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 ist beispielsweise sinnvoll, wenn Ihre Anwendung ihren Zustand über einen anderen Mechanismus neu erstellen kann oder wenn Ihre Anwendung mit vertraulichen Informationen zu tun hat.

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 deine App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, musst du einen zusätzlichen Satz von XML-Sicherungsregeln festlegen, wie in diesem Abschnitt beschrieben, um die Änderungen an der Wiederherstellung von Sicherungen zu unterstützen, die für Geräte mit diesen Android-Versionen eingeführt wurden.

Sicherung unter Android 11 und niedriger verwalten

Anhand der Schritte in diesem Abschnitt können Sie festlegen, 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, die Sicherungsregeln enthält.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
    
  2. Erstellen Sie eine XML-Datei mit dem Namen @xml/backup_rules im Verzeichnis res/xml/. Fügen Sie in dieser Datei Regeln mit den Elementen <include> und <exclude> hinzu. Im folgenden Beispiel werden alle gemeinsamen 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>
    

Gerätebedingungen festlegen, die für die Sicherung erforderlich sind

Wenn Ihre App vertrauliche Daten auf dem Gerät speichert, können Sie Bedingungen angeben, unter denen die Daten Ihrer App in die Sicherung des Nutzers aufgenommen werden. Unter Android 9 (API-Level 28) und 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 Android Sicherungen nur mit einem clientseitigen Secret verschlüsselt, nachdem Nutzer in den Einstellungen oder im Einrichtungsassistenten darüber informiert wurden.

Wenn Sie die Einschlussbedingungen deklarieren möchten, setzen Sie das Attribut requireFlags auf einen oder mehrere ausgewählte Werte in den <include>-Elementen innerhalb Ihrer Sicherungsregeln:

Sicherung_Regeln.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 Sicherungssystem für Schlüssel/Wert-Paare implementiert ist 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 Back-up-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 verwalten

Wenn deine App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, kannst du anhand der Anleitung in diesem Abschnitt festlegen, welche Dateien auf Geräten mit Android 12 oder höher gesichert werden sollen.

  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, die Sicherungsregeln enthält.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
    
  2. Erstellen Sie eine XML-Datei mit dem Namen backup_rules.xml im Verzeichnis res/xml/. Fügen Sie in dieser Datei Regeln mit den Elementen <include> und <exclude> hinzu. Im folgenden Beispiel werden alle gemeinsamen 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 variiert je nach Android-Version, 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, die die Sicherung für Geräte mit Android 11 oder niedriger steuert.

<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 diesen Übertragungstyp gelten. Durch diese Trennung können Sie beispielsweise Dateien oder Verzeichnisse aus Google Drive-Sicherungen ausschließen, während sie während der Übertragung von einem Gerät zu einem anderen (D2D) übertragen werden. Dies ist nützlich, wenn Sie Dateien haben, die zu groß sind, um sie in der Cloud zu sichern, aber problemlos zwischen Geräten übertragen werden können.

Wenn es keine Regeln für einen bestimmten Sicherungsmodus gibt, z. B. wenn der Abschnitt <device-transfer> fehlt, ist dieser Modus für alle Inhalte außer den Verzeichnissen no-backup und cache vollständig aktiviert, wie im Abschnitt Gesicherte Dateien beschrieben.

Ihre App kann das Flag disableIfNoEncryptionCapabilities im Abschnitt <cloud-backup> festlegen, damit die Sicherung nur 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 die Verschlüsselung nicht unterstützt. Da D2D-Übertragungen jedoch nicht an den Server gesendet werden, funktionieren sie auch auf Geräten, die keine Verschlüsselung unterstützen.

Syntax für einschließende und auszuschließende Elemente

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

<include>

Gibt eine zu sichernde Datei oder einen zu sichernden Ordner an. Standardmäßig enthält die automatische Sicherung fast alle Anwendungsdateien. Wenn Sie ein <include>-Element angeben, schließt das System standardmäßig keine Dateien mehr ein und sichert nur die angegebenen Dateien. Wenn du mehrere Dateien einschließen möchtest, verwende mehrere <include>-Elemente.

Unter Android 11 und niedriger kann dieses Element auch das Attribut requireFlags enthalten. Weitere Informationen dazu finden Sie im Abschnitt zum Definieren bedingter Anforderungen für Sicherungen.

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

<exclude>

Gibt eine Datei oder einen Ordner an, die bzw. der bei 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 wurden. Firebase Cloud Messaging (FCM) muss beispielsweise jedes Mal ein Registrierungstoken generieren, wenn ein Nutzer deine App auf einem neuen Gerät installiert. Wenn das alte Registrierungstoken wiederhergestellt wird, kann es zu unerwartetem Verhalten der Anwendung kommen.

  • Dateien für das Debugging in Apps.

  • Große Dateien, die dazu führen, dass die App das Sicherungskontingent von 25 MB überschreitet

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

domain

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

  • root: das Verzeichnis im Dateisystem, in dem alle privaten Dateien dieser Anwendung gespeichert sind.
  • file: von getFilesDir() zurückgegebene Verzeichnisse.
  • database: von getDatabasePath() zurückgegebene Verzeichnisse. Mit SQLiteOpenHelper erstellte Datenbanken werden hier gespeichert.
  • sharedpref: das Verzeichnis, in dem SharedPreferences gespeichert sind
  • 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 den gerätegeschützten Speicher.
path

Gibt eine Datei oder einen Ordner an, der in die Sicherung einbezogen oder von der Sicherung ausgeschlossen werden soll. Beachten Sie Folgendes:

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

BackupAgent implementieren

Bei Apps, in denen die automatische Sicherung implementiert ist, ist kein BackupAgent erforderlich. Optional kannst du aber auch eine benutzerdefinierte BackupAgent implementieren. Dafür gibt es in der Regel zwei Gründe:

  • Sie möchten über Sicherungsereignisse wie onRestoreFinished() und onQuotaExceeded(long, long) benachrichtigt werden. Diese Callback-Methoden werden auch dann ausgeführt, wenn die App nicht ausgeführt wird.

  • Die Gruppe von Dateien, die Sie sichern möchten, lässt sich nicht so einfach mit XML-Regeln ausdrücken. In diesen seltenen Fällen können Sie einen BackupAgent implementieren, der onFullBackup(FullBackupDataOutput) zum Speichern der gewünschten Elemente überschreibt. Wenn Sie die Standardimplementierung des Systems beibehalten möchten, rufen Sie die entsprechende Methode in der Basisklasse mit super.onFullBackup() auf.

Wenn Sie ein BackupAgent implementieren, erwartet das System standardmäßig, dass Ihre Anwendung die Sicherung und Wiederherstellung von Schlüssel/Wert-Paaren ausführt. Wenn Sie stattdessen die dateibasierte automatische Sicherung verwenden möchten, setzen Sie im Manifest Ihrer App das Attribut android:fullBackupOnly auf true.

Bei automatischen Sicherungs- und Wiederherstellungsvorgängen startet das System die Anwendung in einem eingeschränkten Modus. Dadurch wird verhindert, dass die Anwendung auf Dateien zugreift, die zu Konflikten führen können, und dass die Anwendung Callback-Methoden in ihrer BackupAgent ausführen kann. In diesem eingeschränkten Modus wird die Hauptaktivität der App nicht automatisch gestartet, die Contentanbieter 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 Schlüssel/Wert-Paare sichern möchten, können Sie die Implementierung dieser Methoden leer lassen.

Weitere Informationen finden Sie unter BackupAgent erweitern.