読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

Auto Backup for Appsについて

概要

Android Mから導入された自動バックアップのシステムAuto Backup for Appsについてまとめる

詳細

バックアップの仕組みはAndroid2.2から存在していたが、Android Mからは自動的にバックアップがGoogleDriveにとられるようになる
ちなみにAndroid2.2のバックアップの方法も生きてるので、Android Mにアップデートしたからといってバックアップの記述を変える必要は無い

注意点

自動的にバックアップがとってもらえて楽にはなったのだが、自動的にバックアップを取られると困るファイルもあるのでそこらへんの注意点

  • 整合性を失ってしまうファイル

GCMのregistration idとかは端末ごとに割り当てるものなので、バックアップを取られるとプッシュ通知が送られてこなくなる
端末に依存したファイルがある場合バックアップの対象から外すか、ファイルに書き込まない設計にする

  • AccountManagerとの関連性

AccountManagerについては以下参照
Android - AccountManagerを利用する - Qiita
Auto Backup for Appsでバックアップされるのはdata配下だけなので、AccountManagerの情報はバックアップされない
data配下にAccountManagerにログインしてあることが前提のファイルがあるとクラッシュの要因となるので注意

  • ファイルサイズの制限

バックアップできるファイルサイズは25MBまで

バックアップが行われるタイミング

  • 端末がアイドル状態
  • 端末が充電状態
  • 端末がwifiに接続されていること
  • 以前のバックアップから24時間以上経過していること

バックアップされるファイル

デフォルトだとバックアップ対象、非対象は以下のようになる

バックアップ対象となるファイル
  • 内部ストレージのアプリケーションディレクトリ

getApplicationInfo().dataDir()で取得できるディレクトリ

  • 外部ストレージのアプリケーションディレクトリ

getExternalFilesDir()で取得できるディレクトリ

バックアップ非対象のファイル
  • getCacheDir(), getExternalCacheDir()
  • getCodeCacheDir()
  • getExternalFilesDir()以外に存在する外部ストレージファイル
  • getNoBackupFilesDir()

バックアップ対象のファイルの追加と除外

AndroidManifestにバックアップ対象設定ファイルを記載

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.my.appexample">
    <uses-sdk android:minSdkVersion="23"/>
    <uses-sdk android:targetSdkVersion="23"/>
    <application ...
        android:fullBackupContent="@xml/mybackupscheme"
        android:allowBackup="true">
    </app>
    ...
</manifest>

android:fullBackupContent="@xml/mybackupscheme"の箇所
allowBackupがtrueのことも一応確認

あとは指定した名前でバックアップの設定を記載する

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" | "root"]
    path="string" />
    <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
    path="string" />
</full-backup-content>

includeタグを使用した場合、それ以外のファイルはバックアップされなくなる
excludeタグを使用した場合、指定したファイルが除外される
include, excludeタグにはdomain, pathの属性がある

  • file

データディレクトリのfilesディレクトリ
つまりgetFilesDir()
ディレクトリ配下のpathはpath属性に記載

  • database

アプリのデータベースディレクトリ
つまりgetDatabasePath(String)
引数はpath属性に記載

  • sharedpref

アプリのshared_prefsディレクトリ
つまり getSharedPreferences(String)
引数はpath属性に記載

  • external

外部ストレージのディレクトリ
つまりgetExternalFilesDir()
ディレクトリ配下のpathはpath属性に記載

  • root

アプリのデータディレクトリのroot
つまりgetApplicationInfo().dataDir()
ディレクトリ配下のpathはpath属性に記載

バックアップを不許可にしたいとき

AndroidManifestのalloBackupをfalseにする

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.my.appexample">
    <uses-sdk android:minSdkVersion="23"/>
    <uses-sdk android:targetSdkVersion="23"/>
    <application ...
        android:allowBackup="false">
    </application>
    ...
</manifest>

バックアップの検証手順

バックアップ検証準備

設定ファイルのパースをログ出力するためのフラグを立てる

$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE

ログ出力を有効にするとバックアップ時に設定ファイルのパース結果をlocatで見ることができる

バックアップの検証

自分でバックアップを発生させるには、次のコマンドを使ってBackup Managerを初期化する

$ adb shell bmgr run

初期化が完了したら、バックアップを実行
にはバックアップしたいアプリのパッケージをいれる

$ adb shell bmgr fullbackup <PACKAGE>

バックアップが取得できたらアプリのデータを消して次のコマンドを実行し、復元の検証

$ adb shell bmgr restore <PACKAGE>

アプリを一度アンインストールして、再インストールしてもOK