Androidの自動バックアップ機能の罠


Androidの自動バックアップ機能の罠

Androidのバックアップ機能についての知見をまとめておきます。

記事内で使用する用語は以下の前提で記載します(公式ドキュメントの表

  • 自動バックアップ:Android Auto Backup
  • Key/Valueバックアップ:Key/Value Backup (Android Backup Service)

▼ 自動バックアップ機能の有効・無効について

自動バックアップ機能は、ドキュメントにあるようにallowBackupがtrueで有効になります。

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

しかし、ここに罠があります。
allowBackupのドキュメントには、デフォルトで有効になっているとの記載があります。
ということは、特に意識せずにアプリを開発していた場合、意図せず自動バックアップが有効になっていることになります。

▼ Applicationクラスのサブクラスが呼ばれない

自動バックアップによるデータ復元時は、Back up user data with Auto BackupのImplement BackupAgentTest backup and restoreのApp methods not calledに記載があるようにApplicationクラスを継承したサブクラスを使用している場合、サブクラス側で実行されず、基本のApplicationクラスがインスタンス化されて実行されるようです。
ここで、復元後にアプリを起動したときも、サブクラス側がインスタンス化されない問題が発生しました。
Application#onCreateをオーバーライドして、そこが実行される前提で実装しており、クラッシュするなどの問題が発生しました。

AndroidManifest.xml
<manifest ... >
    ...
    <application android:name=".SubApplication" ... >
        ...
    </application>
</manifest>

▼ 自動バックアップ時のデータで復元されてしまう

  1. 自動バックアップが意図せず有効でリリースしてしまう
  2. リリースして、かなり経過後、自動バックアップを無効に変更
  3. Key/Valueバックアップ実装版をリリース

3をリリース後、自動バックアップによるデータ復元が動作しているようなクラッシュログがレポートされました。
実際に動作検証してみたところ、自動バックアップが有効になっていたときにバックアップデータが作成されていると、自動バックアップによる復元が動作することがわかりました。
android:fullBackupOnlyの設定によりKey/Valueバックアップではなく、自動バックアップを優先させる方法もありますが、こちらは無効の状態でした。

自動バックアップで復元してほしくないファイルは、android:fullBackupContentの設定で対応できました。

my_backup_rules.xml
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="file" path="."/>
    <exclude domain="database" path="."/>
    <exclude domain="sharedpref" path="."/>
    <exclude domain="external" path="."/>
    <exclude domain="root" path="."/>
</full-backup-content>
AndroidManifest.xml
<manifest ... >
    ...
    <application android:fullBackupContent="@xml/my_backup_rules" ... >
        ...
    </application>
</manifest>

参考文献

allowBackup が true のときに Application Class が呼ばれないことがあって困った話