自動バックアップでユーザー データをバックアップする

Auto Backup for Apps は、Android 6.0 (API レベル 23) 以降を対象とし実行するアプリケーションのユーザー データを自動的にバックアップします。 Android は、アプリのデータをユーザーの Google Drive にアップロードして保存し、ユーザーの Google アカウント認証情報によって保護されます。 データ量は、アプリのユーザーごとに25MBに制限されており、バックアップデータの保存に料金はかかりません。

Android のバックアップ オプションの概要と、どのデータをバックアップおよび復元すべきかについてのガイダンスについては、データ バックアップの概要を参照してください。

  • アプリの内部ストレージに保存され、getFilesDir()getDir(String, int) によってアクセス可能なファイル。
  • getDatabasePath(String)SQLiteOpenHelper クラスで作成したファイルも含まれます。
  • 外部ストレージ上のファイルは、getExternalFilesDir(String) によって返されるディレクトリに含まれます。
  • Auto Backup は、getCacheDir()getCodeCacheDir()getNoBackupFilesDir() が返すディレクトリ内のファイルは除外されます。

    これらの場所に保存されたファイルは、一時的にしか必要ないか、バックアップ操作から意図的に除外されます。

    特定のファイルを含め、除外するようにアプリを構成することができます。

    注意: Android では、コンポーネントの設定はユーザー データとして扱われません。 アプリの実行中にマニフェストで特定のコンポーネントを有効または無効にする場合、AutoBackup による設定の保存と復元を期待しないでください。 設定状態を保持するには、共有環境設定に保存し、復元時に共有環境設定を復元します。

    バックアップの場所

    バックアップ データは、ユーザーの Google Drive アカウントのプライベート フォルダに保存され、アプリごとに 25MB までに制限されます。 保存されたデータは、ユーザーの個人的な Google ドライブ クォータにはカウントされません。 最新のバックアップのみ保存されます。 バックアップを作成すると、以前のバックアップは削除されます(存在する場合)。

    ユーザーは、Google DriveAndroid アプリで、バックアップされたアプリのリストを見ることができます。 Android を搭載したデバイスでは、ユーザーは Driveapp のナビゲーション ドロワーで、設定 >> アプリ データ

    デバイスの設定寿命ごとのバックアップは、次の例のように別々のデータセットに格納されます:

    • ユーザーが 2 つのデバイスを所有している場合、それぞれのデバイスに対してバックアップ データセットが存在することになります。
    • ユーザーがデバイスを工場出荷時にリセットし、その後、同じアカウントでデバイスをセットアップする場合、バックアップは新しいデータセットに保存されます。 廃止されたデータセットは、一定期間使用されないと自動的に削除されます。

    バックアップのスケジュール

    バックアップは、次のすべての条件が満たされたときに自動的に発生します:

    • ユーザーがデバイスでバックアップを有効にした。 Android 9 では、この設定は、設定 >> バックアップ
    • 前回のバックアップから少なくとも 24 時間経過していること
    • デバイスがアイドル状態であること
    • デバイスが Wi-Fi ネットワークに接続されている (デバイス ユーザーがモバイル データのバックアップを選択していない場合)。

    実際には、これらの条件はほぼ毎晩発生しますが、デバイスは決してバックアップを行わないかもしれません (たとえば、ネットワークに接続しない場合など)。

    自動バックアップの間、システムはアプリをシャットダウンして、ファイル システムに書き込まないようにします。 デフォルトでは、ユーザーがアプリのシャットダウンに気づくため、バックアップ システムでは前景で実行中のアプリは無視されます。

    テストを簡単にするために、Android には、アプリのバックアップを手動で開始できるツールがあります。 詳細については、バックアップと復元のテストを参照してください。

    復元スケジュール

    データは、Play ストアから、デバイス設定中 (システムが以前にインストールしたアプリをインストールするとき)、または adb install を実行してアプリがインストールされると、いつでも復元されます。

    最初のデバイス セットアップ ウィザード中に、ユーザーは利用可能なバックアップ データセットのリストを表示され、どのデータセットからデータを復元するか尋ねられます。 どのバックアップ データセットが選択されても、そのデバイスの祖先データセットとなります。 デバイスは自身のバックアップまたは祖先のデータセットのどちらからでもリストアすることができます。 両方のバックアップが利用可能な場合、デバイスは自身のバックアップを優先します。

    テストを簡単にするために、Android には、アプリの復元を手動で開始できるツールがあります。 詳細については、バックアップと復元のテストを参照してください。

    バックアップの有効化と無効化

    Android 6.0 (API レベル 23) 以上を対象とするアプリは、自動的に自動バックアップに参加します。 アプリのマニフェスト ファイルで、ブーリアン値android:allowBackuptrue ですが、意図を明確にするために、以下のようにマニフェストで属性を明示的に設定することをお勧めします。

    <manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>

    android:allowBackupfalse に設定すると、バックアップは無効化されます。

    ファイルのインクルードと除外

    デフォルトでは、システムはほぼすべてのアプリ データをバックアップします。 詳細については、「バックアップされるファイル」を参照してください。

    1. AndroidManifest.xmlandroid:fullBackupContent<application> 要素に追加して、バックアップされるものを制御するカスタム XML 規則を定義する方法について説明します。 この属性は、バックアップルールを含む XML ファイルを指します。 For example:

      <application ... android:fullBackupContent="@xml/my_backup_rules"></application>
    2. Create an XML file called my_backup_rules.xml in theres/xml/ directory. Inside the file, add rules with the<include> and <exclude> elements.The following sample backs up all shared preferences exceptdevice.xml
      <?xml version="1.0" encoding="utf-8"?><full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/></full-backup-content>

    XML config syntax

    The XML syntax for the configuration file is shown below:

    <full-backup-content> <include domain= path="string" requireFlags= /> <exclude domain= path="string" /></full-backup-content>

    Inside the <full-backup-content> tag, you can define <include> and <exclude> elements:

    • <include> – Specifies a file or folder to backup. By default, Auto Backup includes almost all app files. If you specify an <include> element, the system no longer includes any files by default and backs up only the files specified. 複数のファイルをインクルードするには、複数の<include>要素を使用します。

      注意: getCacheDir()getCodeCacheDir()getNoBackupFilesDir() が返すディレクトリの中のファイルは、たとえインクルードしようとしても常に除外されます。

    • <exclude> – バックアップ中に除外するファイルまたはフォルダーを指定します。 ここでは、通常バックアップから除外されるファイルをいくつか紹介します。
      • サーバーによって発行された、またはデバイス上で生成された、デバイス固有の識別子を持つファイル。 たとえば、Google Cloud Messaging (GCM) は、ユーザーが新しいデバイスにアプリをインストールするたびに、登録トークンを生成する必要があります。 古い登録トークンが復元されると、アプリが予期せぬ動作をする可能性があります。
      • アカウントの資格情報またはその他の機密情報。 バックアップにそのような情報を保存できるようにするのではなく、リストアされたアプリを初めて起動するときにユーザーに再認証するよう求めることを検討してください。
      • アプリのデバッグに関連するファイル。
      • Large files that cause the app to exceed the 25MB backup quota.

    Note: If your configuration file specifies both elements, then the backup contains everything captured by the <include> elements minus the resources named in the <exclude> elements. In other words, <exclude> takes precedence.

    Each element must include the following two attributes:

    • domain – specifies the location of resource. Valid values for this attribute include the following:
      • root – the directory on the filesystem where all private files belonging to this app are stored.
      • file – directories returned by getFilesDir().
      • database – directories returned by getDatabasePath(). Databases created with SQLiteOpenHelper are stored here.
      • sharedpref – the directory where SharedPreferences are stored.
      • external the directory returned by getExternalFilesDir()
    • Note: You cannot back up files outside of these locations.

    • path: Specifies a file or folder to include in or exclude from backup. Note that:
      • This attribute does not support wildcard or regex syntax.
      • You can use . to reference the current directory, however, you cannot reference the parent directory .. for security reasons.
      • If you specify a directory, then the rule applies to all files in the directory and recursive sub-directories.

    The include element can also contain the requireFlags attribute, which thesection describing how to define conditional requirements forbackup section discusses in more detail.

    バックアップに必要なデバイス条件を定義する

    アプリがデバイスに機密情報を保存する場合、アプリのデータがユーザーのバックアップに含まれる条件を指定できます。

    • clientSideEncryption: ユーザーのバックアップは、クライアントサイドシークレットで暗号化されます。 この形式の暗号化は、ユーザーが Android 9 以上でバックアップを有効にし、デバイスにスクリーン ロック (PIN、パターン、またはパスワード) を設定している限り、Android 9 以上を実行しているデバイスで有効です。
    • deviceToDeviceTransfer: ユーザーは、ローカル デバイス間転送をサポートする別のデバイス (Google Pixel など) にバックアップを転送しています。

    開発デバイスを Android 9 にアップグレードした場合、アップグレード後にデータのバックアップを無効化してから再有効化する必要があります。

    含める条件を宣言するには、requireFlags<include> 要素内の希望の値または値に設定します

    my_backup_rules.Item

    My_Backup_Rule.Item

    My_Backup_Rule.Item

    <include>属性を、クライアント側の秘密でバックアップを無効にすることはできません。xml

    <?xml version="1.0" encoding="utf-8"?><full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /><full-backup-content>

    アプリケーションが key-value backupsystem を実装している場合、または BackupAgent を自分で実装している場合、key-value backupsystem が必要です。オブジェクトのトランスポート フラグのセットとカスタム バックアップ エージェントのFLAG_CLIENT_SIDE_ENCRYPTION_ENABLEDFLAG_DEVICE_TO_DEVICE_TRANSFER フラグのビット比較により、バックアップ ロジックにこれらの条件付き要件を適用することも可能です。

    次のコード スニペットは、このメソッドの使用例を示しています。

    Kotlin

    class MyCustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here.}

    Java

    public class MyCustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here.}

    Implement BackupAgent

    Apps that implement Auto Backup do not need to implement a BackupAgent. However, you can optionally implement a custom BackupAgent. Typically, there are two reasons for doing this:

    • You want to receive notification of backup events such as, onRestoreFinished() or onQuotaExceeded(long, long). These callback methods are executed even if the app is not running.
    • You can’t easily express the set of files you want to backup with XML rules. In these rare cases, you can implement a BackupAgent that overrides onFullBackup(FullBackupDataOutput) to store what you want. To retain the system’s default implementation, call the corresponding method on the superclass with super.onFullBackup().

    If you implement a BackupAgent, by default the system expects your app to perform key/value backup and restore.

    自動バックアップと復元操作の間、システムはアプリを制限モードで起動し、アプリが競合の原因となるファイルにアクセスするのを防ぎ、アプリが BackupAgentApplicationBackupAgentApplication オブジェクトをキャストしようとしないことを確認してください。

    あなたの BackupAgent は、Key-Value バックアップに使用する抽象メソッド onBackup()onRestore() を実装しなければなりません。 しかし、Key-Value バックアップを実行しない場合は、これらのメソッドの実装を空白にするだけです。

    詳細については、BackupAgent の拡張を参照してください。

    コメントを残す

    メールアドレスが公開されることはありません。