Android M AutoBackup機能で開発者が対応しておいた方がよいことまとめ


いよいよAndroid Mが対応端末に向けてOTA配信が始まりました。 Android Mといえばパーミッション関連対応が開発者にとって喫緊の課題ですが、その影でAutoBackup機能も地味に色々対応必要そうです。取り急ぎ開発者が自分のアプリで対応すべき点をまとめました。

AutoBackupの概要について

Developer Docsに概要および詳細が書かれていますが、こちらのQiitaの記事に日本語でまとまってます。

端的に述べると、デフォルトでは外部ストレージやキャッシュ以外のデータはまるっと全部バックアップされるようになっています。

取り急ぎ対応したほうが良いこと

1.ID関連のデータをBackupからexcludeする(特にGCM)

  • ユーザー系ID
    手元のM端末で検証したところ、ログインした状態でreinstallすると以前入っていた会員情報がそのまま復活します。 開発端末で複数Mが入った端末があり、それぞれ同じgoogle Accountが設定されている場合、アプリがしっちゃかめっちゃかに同期されます。特にGCM IDは上書き、上書き&上書きで正しくpushがおくられないようになります。Developer Blogにも書いてあるのですが、GCM IDはexcludeが必須です。

You must exclude any device specific identifiers, either issued by a server or generated on the device. This includes the Google Cloud Messaging (GCM) registration token which, when restored to another device, can render your app on that device unable to receive GCM messages.

"サーバーやクライアントで生成されたデバイス特有のIDは除外しましょう。これはGCMトークンも含まれます。"

ていうかデフォルトで省いといてくださいよ…。

  • 広告関連のIDやフラグ
    広告関連のIDやフラグについては、初回起動などトラッキングしている場合、Autobackupによってトラッキングの挙動が変わる可能性があります。マーケットチームとコミュニケーションをとって対応を決めたほうが良い気がします。

2.データの不整合が起きたらマズいデータをexcludeする

SharedPreferenceやDBに保存しているデータで、上書きされるとマズいようなデータは省いたほうがよいです。手元のM端末で、新しいバージョンのアプリ削除 -> 以前のバージョンのアプリreinstallでも 問答無用で上位バージョンのデータに上書きされました。新しい->古いというユースケースはあまりない気はしますが、マスター系のデータなどは場合によっては不具合発生しそうな気がします。

なお、自分のアプリがどんなデータを保持しているのか確認するのはStethoがてっとりばやいです。ResourcesからSharedPreference, DBの情報がさくっと確認できます。

3.(option)開発端末は同期しないようにする

開発端末で複数Mが入った端末があり、それぞれ同じgoogle Accountが設定されている場合、アプリが問答無用で同期される可能性があります。それがいやな場合はAutomatic restoreをoffにすることができます。

設定 -> バックアップとリセット -> 自動復元(Automatic restore)をoffにすれば大丈夫です。

現時点で自分が調査中なこと

  • 同一googleアカウントでの別端末へのAutoBackup
    DocsやDeveloper blogで は、新しい端末でアプリをインストールした場合も自動的に復元されると書いてあるのですが、再現しません。再現方法わかったらここに書きます。(知っている方いたらコメントください)

まとめ

色々書いたけど面倒ならAutobackupはとりあえずoffにしたほうが良いと思います。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.my.appexample">
    <application ...
        android:allowBackup="false">
    </application>
    ...
</manifest>