バックアップと復元をテストする

このページでは、自動バックアップKey-Value バックアップを使用してバックアップと復元処理を手動でトリガーし、アプリでデータを適切に保存および復元する方法について説明します。

バックアップの仕組み

このセクションでは、Android バックアップ フレームワークのさまざまな部分と、自動バックアップと Key-Value バックアップをサポートするアプリとのやり取りについて説明します。アプリ開発段階では、フレームワークの内部作業のほとんどが抽象化されていたため、このような情報を知る必要はありませんでした。ただし、テスト段階では、こうした概念を理解することが重要です。

次の図は、バックアップと復元時のデータの流れを示しています。バックアップ フレームワーク

Backup Manager Service は、バックアップと復元処理を調整および開始する Android システム サービスです。このサービスには、BackupManager API からアクセスできます。バックアップ処理中、このサービスはアプリにバックアップ データを照会し、バックアップ トランスポートに渡します。その後、バックアップ トランスポートがデータをアーカイブします。復元処理中、Backup Manager Service はバックアップ トランスポートからバックアップ データを取得し、データをデバイスに復元します。

バックアップ トランスポートは、バックアップの保存と取得を行う Android コンポーネントです。Android デバイスには、0 個以上のバックアップ トランスポートを含めることができますが、アクティブに設定できるのは 1 つだけです。デバイス メーカーやサービス プロバイダによるカスタマイズにより、利用できるバックアップ トランスポートはデバイスによって異なる場合がありますが、ほとんどの Google Play 対応デバイスには次のトランスポートが付属しています。

  • Google トランスポート - ほとんどのデバイスでアクティブなバックアップ トランスポート。Google モバイル サービスの一部です。このドキュメントでは、ユーザーが Google トランスポートを使用していることを前提としています。このトランスポートは、自動バックアップ データをユーザーの Google ドライブ アカウントのプライベート フォルダに保存します。Key-Value バックアップ データは Android Backup Service に保存されます。
  • ローカル トランスポート - バックアップ データをデバイスにローカル保存します。このトランスポートは通常、開発やデバッグの目的で使用され、実用性はありません。

デバイスにバックアップ トランスポートがない場合、データをバックアップすることはできません。なお、アプリに悪影響はありません。

注意: バックアップ トランスポートはデバイスごとに異なる可能性があるため、バックアップ時はデータのセキュリティを保証できません。ユーザー名やパスワードなどの機密データを保存するためにバックアップする場合は、注意が必要です。

要件

バックアップと復元の処理をテストするには、以下のツールについて少し知っておく必要があります。

  • adb - デバイスやエミュレータでコマンドを実行する
  • bmgr - さまざまなバックアップと復元処理を行う
  • logcat - バックアップと復元処理の出力を表示する

デバイスやエミュレータを準備する

次のチェックリストを確認して、バックアップ テスト用にデバイスまたはエミュレータを準備します。

  • 自動バックアップの場合、Android 6.0(API レベル 23)以降を搭載するデバイスまたはエミュレータを使用していることを確認します。
  • Key-Value バックアップの場合、Android 2.2(API レベル 8)以降を搭載するデバイスまたはエミュレータを使用していることを確認します。
  • バックアップと復元がデバイスまたはエミュレータで有効になっており、Google アカウントが追加されていることを確認します。確認するには次の 2 つの方法があります。
    • デバイスのバージョンに応じて、[設定] > [バックアップと復元] に移動するか、画面上部の検索バーで「バックアップ」を検索します。
    • adb シェルから bmgr enabled を実行します。

    物理デバイスでは通常、初期設定ウィザードでバックアップと復元が有効になります。エミュレータでは設定ウィザードを実行しないため、デバイスの設定でバックアップを有効にしてバックアップ アカウントを指定してください。

  • 次のコマンドを実行して、Google バックアップ トランスポートが使用可能かつ有効であることを確認します。
        adb shell bmgr list transports
        

    次に、コンソールで以下のメッセージが出力されているかを確認します。

        android/com.android.internal.backup.LocalTransport
        * com.google.android.gms/.backup.BackupTransportService
        

Google Play を搭載していない物理デバイスや、Google API のないエミュレータには、Google Backup Transport が含まれていない可能性があります。この記事では、Google Backup Transport を使用していることを前提としています。バックアップと復元は他のバックアップ トランスポートでテストできますが、手順と出力は異なる場合があります。

バックアップをテストする

アプリのバックアップを開始するには、次のコマンドを実行します。

    adb shell bmgr backupnow <PACKAGE>
    

backupnow コマンドは、Android 7.0 以降を搭載するデバイスとエミュレータでご利用いただけます。パッケージのマニフェスト宣言に応じて、Key-Value バックアップまたは自動バックアップが実施されます。バックアップ手順の出力を表示するには、logcat を確認します。次に例を示します。

    D/BackupManagerService: fullTransportBackup()
    I/GmsBackupTransport: Attempt to do full backup on <PACKAGE>

    ---- or ----

    V/BackupManagerService: Scheduling immediate backup pass
    D/PerformBackupTask: starting key/value Backup of BackupRequest{pkg=<PACKAGE>}
    

デバイスで backupnow コマンドを使用できない場合は、下記に示す、自動バックアップまたは Key-Value バックアップのいずれかの手順を行います。

自動バックアップの場合は、次の手順を行います。

  1. 次のコマンドを実行します。
        adb shell bmgr backup @pm@ && adb shell bmgr run
        
  2. adb logcat で以下の出力が行われるのを監視して、前の手順のコマンドが終了するまで待ちます。
        I/BackupManagerService: K/V backup pass finished.
        
  3. フル バックアップを行うには、次のコマンドを実行します。
        adb shell bmgr fullbackup <PACKAGE>
        

注: fullbackup コマンドは、アプリが Key-Value バックアップを実装している場合でも、アプリにフル バックアップを強制します。システムはアプリのバックアップ設定を無視し、android:fullBackupOnly 属性が true に設定されているかのように動作します。

Key-Value バックアップの場合は、次の手順でバックアップをスケジュールして実施します。

  1. 最後のバックアップ以降、アプリが BackupManager.dataChanged() を呼び出していない場合は、次のコマンドを実行して、テスト用のバックアップ処理にアプリを含めることができます。
        adb shell bmgr backup <PACKAGE>
        
  2. 次のコマンドを実行して、バックアップをトリガーできます。
        adb shell bmgr run
        

bmgr backup は、Backup Manager のキューにアプリを追加します。 bmgr run はバックアップ処理を開始します。これにより、Backup Manager はそのキューにあるすべてのバックアップ リクエストを実行します。

Key-Value バックアップをテストする場合は、すべての設定変更でバックアップがスケジュールされることを確認する必要があります。次のいずれかの方法でバックアップのスケジュールを確認できます。

  • adb shell dumpsys backup を実行し、Pending key/value backup の下に表示されるコマンド出力に、アプリがリストされていることを確認します。
  • バックアップのスケジュールを設定するときにメッセージを記録します。その後、adb logcat を実行し、コマンドの出力を確認して、バックアップがスケジュールされたことを確認できます。

復元をテストする

手動で復元を開始するには、バックアップ トークン(以下の取得方法を参照)を使用して次のコマンドを実行します。

    adb shell bmgr restore <TOKEN> <PACKAGE>
    

バックアップ トークンを検索するには、adb shell dumpsys backup を実行します。トークンは、Ancestral:Current: の両ラベルに続く 16 進文字列です。ancestral トークンは、デバイスの初期設定時(デバイス設定ウィザードを使用)に、デバイスを復元するために使用されたバックアップ データセットを参照します。current トークンは、デバイスの現在のバックアップ データセット(デバイスが現在バックアップ データを送信しているデータセット)を参照します。

次に、logcat をチェックして復元手順の出力を確認します。次に例を示します。

    V/BackupManagerService: beginRestoreSession: pkg=<PACKAGE> transport=null
    V/RestoreSession: restorePackage pkg=<PACKAGE> token=368abb4465c5c683
    ...
    I/BackupManagerService: Restore complete.
    

アプリの自動復元をテストするには、adb を使用するか、Google Play ストア アプリを使用して、アプリをアンインストールして再インストールします。

トラブルシューティング

このセクションでは、よくある問題のトラブルシューティングについて説明します。

トランスポートの容量を超過

logcat に次のメッセージが表示された場合:

    I/PFTBT: Transport rejected backup of <PACKAGE>, skipping

    --- or ---

    I/PFTBT: Transport quota exceeded for package: <PACKAGE>
    

アプリで容量を超過しています。バックアップ データの量を減らしてから、もう一度試してください。たとえば、アプリのキャッシュ ディレクトリにのみデータをキャッシュしていることを確認します。キャッシュ ディレクトリはバックアップに含まれません。

フル バックアップは不可

logcat に次のメッセージが表示された場合:

    I/BackupManagerService: Full backup not currently possible -- key/value backup not yet run?
    

Key-Value バックアップ処理がまだデバイスで行われていないため、フル バックアップ処理が失敗しました。bmgr run コマンドを実行して Key-Value バックアップをトリガーしてから、もう一度お試しください。

エージェント待機中にタイムアウト発生

logcat に次のメッセージが表示された場合:

    12-05 18:59:02.033  1910  2251 D BackupManagerService:
        awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package}
    12-05 18:59:12.117  1910  2251 W BackupManagerService:
        Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package}
    12-05 18:59:12.117  1910  2251 W BackupManagerService:
        Can't find backup agent for com.your.app.package
    

アプリがバックアップ用に起動するのに 10 秒以上かかります。ログ出力においてタイムスタンプの違いを確認してください。このエラーは通常、アプリで ProGuard を使用せずに Multidex 構成を使用している場合に発生します。

初期化されていないバックアップ アカウント

logcat に次のメッセージが表示された場合:

    01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for an uninitialized backup account.
    01-31 14:32:45.699  1043 18255 W PFTBT: Transport failed; aborting backup: -1001
    01-31 14:32:45.699  1043 18255 I PFTBT: Full backup completed with status: -1000
    

バックアップ データセットが初期化されていないため、バックアップが中止されました。 adb shell bmgr run コマンドを使用してバックアップ マネージャーを実行します。その後に再度バックアップを実施してください。

アプリのメソッドが呼び出されていない

自動バックアップは Application の基本クラスを使用してアプリを起動するため、アプリの設定メソッドが呼び出されない場合があります。自動バックアップもアプリのアクティビティを起動しないため、アプリがアクティビティで設定を行うとエラーが表示される場合があります。詳しくは、BackupAgent を実装するをご覧ください。

一方、Key-Value バックアップは、アプリ マニフェスト ファイルで宣言する Application サブクラスを使用してアプリを起動します。