19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-03-17

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 が呼ばれないことがあって困った話

19
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?