AndroidやFlutterでFirebaseを利用すると、次のエラーが表示されることがあります。
Default FirebaseApp is not initialized in this process.
Make sure to call FirebaseApp.initializeApp(Context) first.
Flutterでは次の形式もあります。
[core/no-app] No Firebase App '[DEFAULT]' has been created
Firebase AuthenticationやFirestoreを取得する時点で、デフォルトFirebaseAppが存在しない状態です。
AndroidとFlutterの違い
ネイティブAndroid
通常はFirebaseInitProviderが、google-services.jsonから生成されたリソースを使ってデフォルトFirebaseAppを自動初期化します。
一般的な構成では、各ActivityでFirebaseApp.initializeApp()を呼ぶ必要はありません。
Flutter
main()で明示的に初期化します。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(const MyApp());
}
Androidの原因1:google-services.jsonがない
基本配置:
app/google-services.json
Flutter・React Native:
android/app/google-services.json
ファイル名、配置先、build variant用ディレクトリを確認します。
Androidの原因2:Googleサービスプラグインがない
アプリモジュールへ適用します。
plugins {
id("com.android.application")
id("com.google.gms.google-services")
}
プラグインがJSONを処理し、google_app_idなどのリソースを生成します。
生成先の例:
app/build/generated/res/google-services/debug/values/values.xml
Androidの原因3:パッケージ名が一致しない
Gradle applicationId
=
google-services.json package_name
一致しない場合は、正しいパッケージ名のFirebase Androidアプリを登録し、JSONを再取得します。
Androidの原因4:FirebaseInitProviderを削除した
Merged Manifestで次を確認します。
com.google.firebase.provider.FirebaseInitProvider
Manifestに次のような削除設定が残っていないか検索します。
<provider
android:name="com.google.firebase.provider.FirebaseInitProvider"
tools:node="remove" />
手動でproviderを追加するより、依存関係とManifestマージを修正します。
Androidの原因5:初期化より早くFirebaseへアクセスしている
トップレベル変数や静的オブジェクトで早期に取得すると、初期化順が分かりにくくなります。
避けたい例:
object Repository {
val auth = FirebaseAuth.getInstance()
}
改善例:
class Repository {
val auth by lazy {
FirebaseAuth.getInstance()
}
}
通常の自動初期化が正常ならApplication起動時に利用できますが、静的初期化へ依存しすぎない構成にします。
Androidの原因6:別プロセスで利用している
Manifestにandroid:processを指定したServiceなどからFirebaseを使うと、エラー文に次のようなプロセス名が出ることがあります。
com.example.app:remote
Firebase処理をメインプロセスへまとめることを優先します。
Androidの原因7:名前付きAppだけ作成した
FirebaseApp.initializeApp(
context,
options,
"secondary"
)
これはsecondaryを作成し、[DEFAULT]は作成しません。
名前付きアプリを使う場合は、対象サービスへそのFirebaseAppを渡します。
val app = FirebaseApp.getInstance("secondary")
val firestore = FirebaseFirestore.getInstance(app)
Flutterの原因1:initializeAppを書いていない
void main() {
runApp(const MyApp());
}
この状態でFirebaseAuth.instanceなどへアクセスするとcore/no-appになります。
Flutterの原因2:awaitしていない
避けたい例:
void main() {
Firebase.initializeApp();
runApp(const MyApp());
}
初期化完了を待ちます。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(const MyApp());
}
Flutterの原因3:firebase_options.dartが古い
flutterfire configure
flutter clean
flutter pub get
flutter run
別Firebaseプロジェクトや別パッケージ名へ変更した場合は、現在の設定で生成し直します。
Flutterの原因4:別のmainファイル
lib/main_development.dart
lib/main_production.dart
実際にビルドしているエントリーポイントにも初期化処理が必要です。
flutter run --target lib/main_development.dart
登録済みFirebaseAppを確認する
Android:
FirebaseApp.getApps(applicationContext).forEach {
Log.d("Firebase", "${it.name}: ${it.options.projectId}")
}
Flutter:
for (final app in Firebase.apps) {
debugPrint('${app.name}: ${app.options.projectId}');
}
正常な単一プロジェクト構成では、通常[DEFAULT]が存在します。
手動初期化は最後の選択肢
特殊な構成ではFirebaseOptionsを指定できます。
val options = FirebaseOptions.Builder()
.setApplicationId("APP_ID")
.setApiKey("API_KEY")
.setProjectId("PROJECT_ID")
.build()
FirebaseApp.initializeApp(applicationContext, options)
通常のAndroidアプリでは、これを追加する前にJSON、プラグイン、生成リソース、Providerを修正してください。
確認順
Android
- JSONの配置
- Googleサービスプラグイン
- applicationIdとpackage_name
- 生成されたgoogle_app_id
- FirebaseInitProvider
- コードの実行順
- 別プロセス
- 名前付きFirebaseApp
Flutter
firebase_coreflutterfire configurefirebase_options.dartWidgetsFlutterBinding.ensureInitialized()Firebase.initializeApp()をawaitrunApp()より前か- 実際のmainファイル
まとめ
ネイティブAndroidでは、自動初期化の失敗原因を修正します。
Flutterでは、次の順番を守ります。
WidgetsFlutterBinding.ensureInitialized
→ Firebase.initializeAppをawait
→ runApp
→ Firebaseサービスを利用
逆に二重初期化エラーが出る場合はFirebaseApp [DEFAULT] already existsを確認してください。
一次情報
公式参考資料
Google PlayやFirebaseの画面・要件は変更される場合があります。公開作業の前に、リンク先の最新情報も確認してください。