Flutter と Firebase Authで開発している際、「特定の端末(Pixel 9aなど)でのみ、アプリをタスクキル(強制終了)するとログイン状態が保持されず、再起動時にログアウトしてしまう」 という現象に遭遇したので忘備録。
他のAndroid端末やiOSでは問題なく永続化されているにもかかわらず、Pixel端末でのみ発生する場合の解決策です。
環境
- Flutter 3.32.8-stable
- firebase_auth
- 端末: Pixel 9a (Android 14/15)
- 発生条件: アプリをバックグラウンドから完全に終了(タスクキル)して再起動した時
結論
android/app/src/main/AndroidManifest.xml の <application> タグに、以下の2行を追加してバックアップを無効化してください。
android:allowBackup="false"
android:fullBackupContent="false"
原因
なぜログアウトしてしまうのか?
Androidのデフォルト設定では android:allowBackup="true"(自動バックアップ有効)になっています。この設定が有効だと、OSはアプリの再起動時やバックグラウンド処理のタイミングで、アプリのローカルデータ(Shared Preferencesなど)を自動的に復元しようと試みます。
Firebase Authは認証トークンを端末内に保存しますが、その暗号化には Android Keystore(システムキーストア) を利用しています。
- タスクキル発生: OSがデータをバックアップ/保持しようとする
- 再起動: OSがデータを復元するが、Keystoreの暗号鍵までは完全な状態で復元されない(あるいは整合性が取れなくなる)
- 不整合: Firebase Auth SDKが「保存されたトークンはあるが、現在のKeystoreの鍵では復号できない」と判断
-
結果: セキュリティ上の理由からデータを破棄し、未ログイン状態(
currentUser == null)に戻る
まとめ
- Pixel端末でだけログアウト現象が起きる場合は、
AndroidManifest.xmlの設定を疑う -
android:allowBackup="false"を明示的に設定