[この記事は Wojtek Kaliciński、Android デベロッパー アドボケートによる Android Developers Blog の記事 "Auto Backup for Apps made simple" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
アプリの自動バックアップによって、アプリケーション コードを作成することなく、シームレスなアプリ データのバックアップと復元が可能になります。この機能は、近日中に公開される M リリースを実行する Android デバイスで使用できます。この機能をアプリで有効にするために必要なのは、targetSdkVersion を 23 にアップデートすることだけです。この機能を今すぐ
M Developer Preview でテストすることができます。ここでは、targetSdkVersion に関係なく、すべてのアプリに対して自動バックアップが有効になっています。
アプリの自動バックアップは Google によってユーザーと開発者の両方に無料で提供されます。さらに、Google Drive に保存されているバックアップ データはユーザーの容量にはカウントされません。ただし、転送されるデータに関して、ユーザーの携帯電話 / インターネット プロバイダから料金が請求される可能性があることに注意してください。
アプリの自動バックアップとは
デフォルトでは、バックアップを必要とするユーザーのために、アプリのすべてのデータ ファイルがユーザーのドライブに自動的にコピーされます。これにはデータベース、共有プリファレンス、アプリケーションのプライベート ディレクトリ内のその他のコンテンツが含まれ、アプリごとに最大 25 メガバイトに制限されます。
Context.getCacheDir()
、
Context.getCodeCacheDir()
および
Context.getNoBackupFilesDir()
で指定されている場所に保存されているデータはすべてバックアップから除外されます。外部ストレージ上のデータについては、
Context.getExternalFilesDir()
内のデータだけがバックアップされます。
バックアップ対象の指定方法
バックアップ対象にすることができるアプリ データをカスタマイズするには、
res/xml
フォルダ内にバックアップ構成ファイルを作成し、アプリのマニフェストで参照します:
<application
android:fullBackupContent="@xml/mybackupscheme">
構成ファイルで、デフォルトのバックアップ エージェントの動作を微調整するために必要な
<include/>
ルールまたは
<exclude/>
ルールを指定します。この
ドキュメントに記載されている、ルールの構文の詳細説明を参照してください。
バックアップから除外する内容
特定のアプリ データは、バックアップの対象とすることができません。このようなデータについては、上記のメカニズムのいずれかを使用してください。例:
- サーバーによって発行されたか、デバイス上で生成されたデバイスに固有の識別子は除外する必要があります。これには Google Cloud Messaging (GCM) 登録トークンが含まれます。このトークンを別のデバイスに復元すると、そのデバイス上のアプリが GCM メッセージを受信できなくなります。
- アカウントの資格情報やその他の秘密情報はバックアップから除外することを検討してください。たとえば、バックアップにこのような情報を保存するのではなく、復元されたアプリを最初に起動するときにユーザーに再認証を要求するなどしてください。
多種多様なアプリが存在することを考えると、開発者にとって重要なのは、自動バックアップがもたらすユーザーへのメリットをどうしたら最大限にできるか、を検討することです。目標は、新しいデバイスの設定の手間を省くことです。ほとんどの場合、これはユーザーのプリファレンスやローカルに保存されたコンテンツを転送することを意味します。
たとえば、インストール時に復元できるよう共有プリファレンスに保存されたユーザーのアカウントがある場合、ユーザーは、以前のサインイン時に使用したアカウントについて考える必要さえなく、パスワードを送信して続行することができます!
さまざまなログイン (Google サインインやその他のプロバイダー、ユーザー名/パスワード) をサポートする場合、以前に使用したログイン方法を容易に記憶できるため、ユーザーがそのような情報を覚えておく必要がありません。
主要/重要なバックアップからの移行
従来の主要/重要なバックアップを、
BackupAgent をサブクラス化してマニフェスト (
android:backupAgent
) で設定することによって実装していた場合、完全なデータのバックアップに移行するのは非常に簡単です。単に
android:fullBackupOnly="true"
属性を
<application/>
に追加するだけですみます。これは M バージョンより前のバージョンの Android では無視されます。つまり、
onBackup/onRestore
は呼び出されますが、M+ デバイス上では、独自の BackupAgent を提供しながら完全なデータのバックアップを使用したいという意向がシステムに通知されます。
主要/重要なバックアップを使用せず、
onCreate(), onFullBackup()
でカスタム処理を実行する場合や、
onRestoreFinished()
でのリストア処理の発生時に通知を受け取る場合でも、同じアプローチを使用できます。XML の include/exclude ルールの実装を保持する場合は、
super.onFullBackup()
を呼び出すことを忘れないでください。
バックアップ/復元のライフサイクル
データの復元は、ユーザーがアプリを起動できるようになる前に、パッケージのインストールの一部として実行されます。デバイスの充電中に Wi-Fi に接続されている場合、1 日に 1 回バックアップが実行されます。アプリがデータの制限 (現在は 25 MB に設定されている) を超えた場合、その後のバックアップは実行されず、最後に保存されたスナップショットがその後の復元に使用されます。アプリのプロセスが bmgr コマンドを使用して手動で開始された場合、完全なバックアップの実行後、復元の前に、そのプロセスが停止されます (詳細については、以下を参照)。
今すぐアプリをテスト
自動バックアップのテストを開始する前に、デバイスまたはエミュレータに最新の M Developer Preview が存在していることを確認してください。APK をインストールした後で、adb shell コマンドを使用して
bmgr ツールにアクセスしてください。
Bmgr はバックアップ マネージャーの操作に使用できるツールです。
bmgr run
は即時バックアップ パスをスケジュールします。バックアップ マネージャーが正しく初期化できるように、デバイスにアプリをインストールした後で、このコマンドを実行する必要があります。
bmgr fullbackup <packagename>
は完全なデータのバックアップ操作を開始します。
bmgr restore <packagename>
は以前にバックアップしたデータを復元します。
bmgr run
を起動することを忘れた場合、
fullbackup
コマンドや restore コマンドを試行したときに Logcat にエラーが表示されることがあります。問題が解決しない場合は、バックアップが有効になっていて、システムの [設定] > [バックアップとリセット] で Google アカウントが設定されていることを確認してください。
詳細はこちらから
GitHub で、自動バックアップの使用方法を示すサンプル アプリケーションを検索できます。完全なドキュメントは
developer.android.com で入手できます。
Android M 機能の詳細を参照するには、Google+
Android M Developer Preview Community に参加してください。自動バックアップでバグを見つけた場合、
Bug Tracker での報告をお願いします。
Posted by
Ryuichi Hoshi - Developer Relations Team