Android 6.0から、特別な実装なしで自動バックアップを実現する機能「Auto Backup for Apps」が追加されました。
とても便利な機能ですが、詳細を把握していないと思いもよらぬバグを招きかねないので、詳細をまとめました。
バックアップファイルの保存場所
自動バックアップはGoogle Driveに保存されます。
サイズは25MBまで。
25MBを超えた場合、BackupAgent#onQuotaExceeded()が呼ばれ、それ以降バックアップが止まります。
以降、25MBを下回ったか定期的にチェックされ、少なくなった場合は自動バックアップが再開されます。
バックアップデータはユーザーの容量にはカウントされないので、Google Driveをギリギリまで使っているユーザーのバックアップが失敗する、という事は無さそうです。
他のアプリから読み込んだりすることはできません。
ユーザーも、直接バックアップ内容を確認することはできませんが、Android9.0以降では、Google Driveアプリから、バックアップされているアプリ名と最終バックアップ日時が確認できます。
(※ Android6.0では見れない。7.0〜8.0は未確認)
Google Drive > 設定 > アプリの自動バックアップ: バックアップとリセット > アプリのデータ
バックアップ対象
初期設定では、以下のファイルがバックアップ対象になります。
- Shared preferencesファイル
- getFilesDir()かgetDir(String, Int)でアクセス出来るアプリ内ファイル
- getExternalFilesDir(String)でアクセス出来る外部ストレージファイル
- getDatabasePath(String)でアクセスできるsqliteファイルと、SQLiteOpenHelperによって生成されるファイル
起動後にダウンロードさせる画像や音声などは、バックアップ対象外領域(getNoBackupFilesDir())に置くか、下記で説明しているバックアップ対象外の指定をすること。
バックアップの有効化/無効化
Android 6.0 (API level23)以降であれば、何も指定しないと自動バックアップが有効になります。
バックアップを有効にする場合は、明示的にその意図をAndroidManifest.xmlに記述する事が推奨されています。
<manifest ... > ... <application android:allowBackup="true" ... > ... </application> </manifest>
自動バックアップをoffにしたい場合は「false」を指定します。
バックアップ対象/除外の任意指定
バックアップ設定ファイルxmlを作成して、manifestに指定することで、指定したファイルのみをバックアップ対象に指定できます。
1. バックアップ設定ファイルを作成
ファイルリストで右クリック > New > Android Resource File > Resource typeを「xml」に > OK をクリック
これでres/xml 直下に設定ファイルが生成されます。
2. バックアップ設定ファイルの書き方
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
バックアップに含めるファイルは「include」
バックアップから除外するファイルは「exclude」
に指定します。
「domain」は対象とするフォルダで5種類あります。
- root
getApplicationInfo().dataDir()
デフォルトで指定されるユーザデータフォルダ - file
getFilesDir()かgetDir(String, Int)
アプリ内フォルダ - database
getDatabasePath()かSQLiteOpenHelperが生成する
- sharedpref
SharedPreferencesが保存されるフォルダ
- external
getExternalFilesDir()
外部ストレージフォルダ
「path」にはバックアップ指定もしくは除外する「ファイル」か「フォルダ」を指定します。
pathを指定しない場合はdomainで指定したフォルダ以下全てがバックアップ対象or除外となります。
- ワイルドカードや正規表現はサポートしていません。
- 「.」でカレントディレクトリを指定できるが、セキュリティの関係で「..」は指定できません。
- フォルダを指定した場合、それ以下の全てのファイルとフォルダに再帰的に属性が反映されます。
3. バックアップ設定ファイルをmanifestに指定
作成したバックアップ設定ファイルをAndroidManifest.xmlに指定することで、バックアップ設定が有効になります。
<application ..... android:fullBackupContent="@xml/backup_settings" ..... </application>
バックアップ/リストアのタイミング
次の条件が全て満たされている時に、バックアップが実行されます。
- ユーザーがバックアップを有効にしている。
(Android9では 設定>システム>バックアップから変更可能) - 最後のバックアップから24時間以上が経過している。
- 端末がアイドル状態。
- 端末がWi-Fiに繋がっている。(モバイル通信でのバックアップを許可していない場合)
バックアップからのデータリストアは、apkがインストールされ、ユーザーがアプリを起動し、利用可能になる前に実行されます。
バックアップ/リストアのテスト方法
Googleが用意してくれているコマンドラインツールadb(Android Debug Bridge)を使うことで強制的にバックアップ/リストアを起こすことができます。
端末がクラウドバックアップに対応しているかのチェック
「bmgr」でバックアップとリストアに関する色々な処理ができます。
「bmgr list transports」では、端末が対応しているバックアップ方法の一覧が表示されます。
adb shell bmgr list transports
Pixelで試した結果
「BackupTransportService」があればバックアップに対応しています。
Google Playとエミュレータが入っていない実機ではバックアップに対応していない場合があるようです。
バックアップの強制実行
「bmgr backupnow」で文字の通り、バックアップを強制実行できます。
<PACKAGE>には、バックアップを実行したいアプリのパッケージを入れます。
adb shell bmgr backupnow <PACKAGE>
「backupnow」はAndroid7.0以降の実機かエミュレータでのみ実行可能。
実行するとこんな表示になります。
リストアの強制実行
「bmgr restore」でリストアを強制実行できます。
<PACKAGE>には、リストアを実行したいアプリのパッケージを入れます。
<TOKEN>には、以降に記述しているコマンドで取得できます。
<TOKEN>無しでも実行できますが非推奨となっています。
adb shell bmgr restore <TOKEN> <PACKAGE>
<TOKEN>の取得
adb shell dumpsys backup
アプリを消して再インストールしてもリストアされるのでそちらを選択してもOKです。
参考資料
Android Developersガイド
「Back up user data with Auto Backup」(英語)
https://developer.android.com/guide/topics/data/autobackup
「自動バックアップでユーザーデーターをバックアップする」 (日本語)
https://developer.android.com/guide/topics/data/autobackup?hl=ja
「Test backup and restore」(英語)
https://developer.android.com/guide/topics/data/testingbackup.html
Google Developersブログ
「アプリの自動バックアップがシンプルに」
https://developers-jp.googleblog.com/2015/09/blog-post.html
原文「Auto Backup for Apps made simple」 (英語)
https://android-developers.googleblog.com/2015/07/auto-backup-for-apps-made-simple.html
twitterでも開発情報を発信していますので、フォローお願いします。