Home

 

 

Backup für Android Anwendungsdaten


Ein Beitrag von David MüllerDMU Leger klein

Anwendungen haben mit dem Android API 2.2 Froyo die Möglichkeit, ihre Daten „in der Cloud“, das heißt auf Googles Servern, zu speichern. In der API ist dafür das neue Package android.app.backup hinzugekommen, in dem der BackupManager liegt und der Standardfall „Anwendungseinstellungen sichern“ schon fast fertig implementiert ist.

Die Backup API stellt für Anwendungen bereit, was bisher schon von Android intern genutzt wurde, um zum Beispiel bei einem Firmwareupgrade die Systemeinstellungen wiederherzustellen.

Die API ist dafür gedacht, die Daten der Anwendung von einem Gerät zum anderen zu migrieren oder nach einer Neuinstallation wiederherzustellen. Die Frage „inkrementell oder differenziell?“ spielt folglich keine Rolle, es geht im Allgemeinen um Komplettbackups. Sicherung und Wiederherstellung werden zwar in bestimmten Situationen vom Betriebssystem in Gang gesetzt, die Details liegen jedoch in der Verantwortung der jeweiligen Anwendung. Im Folgenden wird gezeigt, wie die Backup API anzusprechen ist.

Voraussetzungen

Erste Voraussetzung für die Nutzung der Backup API ist eine einfache Registrierung der Anwendung bei Google. Auf Basis des Package Name erhält man einen Registrierungsschlüssel, der in die Manifest-Datei wandert.

Zweite Voraussetzung ist die Ergänzung der Manifest-Datei um das android:backupAgent Attribut mit dem Klassennamen der Klasse, die Sicherung und Wiederherstellung steuert. Der folgende Code-Abschnitt zeigt die relevanten Ergänzungen für die Beispielanwendung Amando aus dem Androidbuch:

 
  <manifest ... package="de.androidbuch.amando" ...>

    <application android:label="Amando" android:backupAgent="DemoBackupAgent">
        <activity ... >

            ...
        </activity>
 
    <meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAItgF9i2_rbLH4b1-v0ffZxR2Zx_k8NtK51yQAdg" />

    </application>
  </manifest>
 

Berechtigungen kommen nur ins Spiel, wenn eine Anwendung das Backup von anderen Anwendungen lostreten will. Dazu benötigt man die Berechtigung android.permission.BACKUP.

Die letzte Voraussetzung betrifft die Umgebung, in der die Anwendung läuft: Im Gerät muß ein Google Account eingerichtet sein, und in den Systemeinstellungen "Privacy Settings" müssen "Back up my data" und "Automatic Restore" einen Haken haben.

BackupAgent Implementieren

Nun zur Implementierung: Im einfachen Fall leitet man die eigene Klasse von BackupAgentHelper ab. Für das Sichern der Standard-Anwendungseinstellungen reicht der folgende Quelltext:

 
  public class DemoBackupAgent extends BackupAgentHelper {
 
    // The name of the SharedPreferences file

    static final String PREFS = "my.package" + "_preferences";
 
    // A key to uniquely identify the backup data part

    static final String DEF_PREFS_KEY = "default_prefs";
 
    // Create the helper and add it to the backup agent
    public void onCreate() {

      SharedPreferencesBackupHelper helper =
          new SharedPreferencesBackupHelper(this, PREFS);
      addHelper(DEF_PREFS_KEY, helper);
    }
  }
 

Weitere Einstellungsdateien können durch zusätzliche SharedPreferenceBackupHelper Exemplare gesichert werden. Kaum mehr Aufwand erfordert das Sichern von anderen Dateien, deren Namen man als Liste einem FileBackupHelper übergeben kann (aber Vorsicht – von Haus aus nicht Threadsafe!):

 
  public class DemoBackupAgent extends BackupAgentHelper {
 
    // the names of the files to backup
    static final String BOOKMARKS = "bookmarks";
    static final String HISTORY = "history";

 
    // A key to uniquely identify the backup data part
    static final String FILES_BACKUP_KEY = "savedFiles";
 
    // Create the helper and add it to the backup agent

    public void onCreate() {
      FileBackupHelper helper =
          new FileBackupHelper(this, BOOKMARKS, HISTORY);
      addHelper(FILES_BACKUP_KEY, helper);
    }

  }
 

Alles andere muß selbst implementiert werden, am besten als weitere Unterklassen von BackupAgentHelper.

BackupManager aufrufen

Nach einer zu sichernden Änderung gibt die Anwendung dem BackupManager über den Aufruf von BackupMangager::dataChanged() eine Sicherung in Auftrag. Diesen Auftrag führt der BackupManager asynchron aus, mehrere angesammelte Aufträge derselben Anwendung werden als einer behandelt. Wann und ob überhaupt eine Sicherung durchgeführt wird ist geräteabhängig. Die Anwendung muß damit umgehen können, dass eventuell nichts passiert.

Eine Wiederherstellung erfolgt normalerweise automatisch bei Neuinstallation der Anwendung. Eine Anwendung kann das im Prinzip aber auch selbst anfordern, indem sie die Methode BackupManager::requestRestore(RestoreObserver) aufruft. In der Praxis des Emulators führt das jedoch zu einer Security Exception wegen scheinbar fehlender BACKUP Berechtigung.

Offensichtlich will Google sichergehen, dass die Backup API nicht für andere Zwecke mißbraucht wird...

Steuerung über die adb shell

Zum Test kann der BackupManager direkt über die adb shell direkt angesprochen werden, um eine Wiederherstellung durchzuführen:

 
  adb shell bmgr restore <package_name>
 

Ein sofortiges Backup ist über diesen Weg ebenfalls möglich:

 
  adb shell bmgr backup <package_name>
  adb shell bmgr run
 

Über die Shell kann der Backup Manager schließlich direkt aktiviert werden, anstatt die oben gezeigten Einstellungen zu setzen:

 
  adb shell bmgr enable true
 

Fazit

Dieser Überblick sollte als Einstieg in die Backup API reichen. Ausführlicher - dafür auf Englisch - beschreibt ein Artikel in der API Dokumentation die Nutzung des Backup APIs.

Im zugehörigen Beispielprojekt BackupRestore finden sich verschiedene BackupHelper-implementierungen.

Wegen dem recht geringen Aufwand zur Einbindung der Backup API sollte zumindest die grundlegende Sicherung in keiner Anwendung fehlen!