Androidの自動バックアップ機能の罠
Androidのバックアップ機能についての知見をまとめておきます。
記事内で使用する用語は以下の前提で記載します(公式ドキュメントの表)
- 自動バックアップ:Android Auto Backup
- Key/Valueバックアップ:Key/Value Backup (Android Backup Service)
▼ 自動バックアップ機能の有効・無効について
自動バックアップ機能は、ドキュメントにあるようにallowBackupがtrueで有効になります。
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
しかし、ここに罠があります。
allowBackupのドキュメントには、デフォルトで有効になっているとの記載があります。
ということは、特に意識せずにアプリを開発していた場合、意図せず自動バックアップが有効になっていることになります。
▼ Applicationクラスのサブクラスが呼ばれない
自動バックアップによるデータ復元時は、Back up user data with Auto BackupのImplement BackupAgent、Test backup and restoreのApp methods not calledに記載があるようにApplicationクラスを継承したサブクラスを使用している場合、サブクラス側で実行されず、基本のApplicationクラスがインスタンス化されて実行されるようです。
ここで、復元後にアプリを起動したときも、サブクラス側がインスタンス化されない問題が発生しました。
Application#onCreateをオーバーライドして、そこが実行される前提で実装しており、クラッシュするなどの問題が発生しました。
<manifest ... >
...
<application android:name=".SubApplication" ... >
...
</application>
</manifest>
▼ 自動バックアップ時のデータで復元されてしまう
- 自動バックアップが意図せず有効でリリースしてしまう
- リリースして、かなり経過後、自動バックアップを無効に変更
- Key/Valueバックアップ実装版をリリース
3をリリース後、自動バックアップによるデータ復元が動作しているようなクラッシュログがレポートされました。
実際に動作検証してみたところ、自動バックアップが有効になっていたときにバックアップデータが作成されていると、自動バックアップによる復元が動作することがわかりました。
android:fullBackupOnlyの設定によりKey/Valueバックアップではなく、自動バックアップを優先させる方法もありますが、こちらは無効の状態でした。
自動バックアップで復元してほしくないファイルは、android:fullBackupContentの設定で対応できました。
<?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>
<manifest ... >
...
<application android:fullBackupContent="@xml/my_backup_rules" ... >
...
</application>
</manifest>