Androidアプリをビルドした際、次のエラーが表示されることがあります。
File google-services.json is missing from module root folder.
The Google Services Plugin cannot function without it.
FlutterやReact NativeのAndroid版でも、Gradleビルド中に同じエラーが発生します。
これは、GoogleサービスGradleプラグインが有効になっているものの、ビルド対象のアプリモジュールからgoogle-services.jsonを見つけられない状態です。
module root folderとは
ここでいうmodule root folderは、プロジェクト全体のルートではありません。
通常は、com.android.applicationが適用されているアプリモジュールの直下です。
標準的なAndroidプロジェクト:
MyApp/
├── app/
│ ├── build.gradle.kts
│ ├── google-services.json
│ └── src/
├── build.gradle.kts
└── settings.gradle.kts
正しい基本配置:
app/google-services.json
間違いやすい配置:
MyApp/google-services.json
最短の解決手順
- Firebaseコンソールから対象AndroidアプリのJSONを取得する
- ファイル名を
google-services.jsonにする - ビルド対象のアプリモジュールを確認する
- そのモジュール直下へ配置する
com.google.gms.google-servicesの適用先を確認する- build variantやflavor用ディレクトリを確認する
- CIではビルド前にファイルを復元する
- クリーンビルドする
原因1:ファイル名が違う
同じファイルを複数回ダウンロードすると、次のような名前になることがあります。
google-services (1).json
google-services (2).json
プラグインが探す名前は次のとおりです。
google-services.json
Windowsでは拡張子が隠れていると、実際には次の名前になっている場合もあります。
google-services.json.json
google-services.json.txt
原因2:プロジェクト直下へ置いている
間違い:
project/google-services.json
正しい基本配置:
project/app/google-services.json
GoogleサービスGradleプラグインは、アプリモジュールや対応するsource setから構成ファイルを探します。
原因3:別のモジュールへ置いている
複数アプリモジュールがあるプロジェクトでは、app以外の名前が使われることがあります。
project/
├── customerApp/
├── adminApp/
└── shared/
customerAppをビルドしている場合、配置先は次のようになります。
customerApp/google-services.json
アプリモジュールは、Gradleファイルの次の設定で確認できます。
plugins {
id("com.android.application")
}
com.android.libraryのモジュールと混同しないでください。
原因4:プラグイン適用先が違う
次のプラグインを適用しているモジュールと、JSONを配置したモジュールを一致させます。
plugins {
id("com.android.application")
id("com.google.gms.google-services")
}
別のモジュールへプラグインを適用していると、そのモジュール側でmissingエラーが発生します。
build type・flavor別の配置
GoogleサービスGradleプラグインは、環境別の構成ファイルに対応しています。
debugとrelease
app/src/debug/google-services.json
app/src/release/google-services.json
product flavor
app/src/development/google-services.json
app/src/production/google-services.json
特定のvariantだけ失敗する場合は、そのvariantに対応するファイルがあるか確認します。
Flutterでの配置場所
Flutterプロジェクトでは、Androidアプリモジュールは通常次の場所です。
android/app/
したがって、基本配置は次のとおりです。
android/app/google-services.json
間違いやすい場所:
flutter_project/google-services.json
flutter_project/android/google-services.json
FlutterFire CLIを使用している場合は、次も再実行します。
flutterfire configure
flutter clean
flutter pub get
React Nativeでの配置場所
一般的なベアReact Nativeプロジェクト:
android/app/google-services.json
エラーを出しているAndroidモジュールのGradleファイルと、JSONが同じモジュール階層にあるか確認してください。
Expoでの設定
Expoの構成では、app configからJSONのパスを指定する場合があります。
{
"expo": {
"android": {
"googleServicesFile": "./google-services.json"
}
}
}
確認項目:
- 指定パスにファイルが存在するか
- EAS Buildへファイルを渡せているか
android.packageとFirebase登録パッケージ名が一致するか- 開発用と本番用を取り違えていないか
CIだけ失敗する場合
ローカルにはファイルがあるものの、.gitignoreで除外され、CIへ含まれていないケースがあります。
GitHub ActionsでBase64から復元する例:
- name: Restore google-services.json
run: |
mkdir -p android/app
echo "${{ secrets.GOOGLE_SERVICES_JSON_BASE64 }}" \
| base64 --decode \
> android/app/google-services.json
ビルド前に存在を確認します。
- name: Verify Firebase config
run: test -f android/app/google-services.json
ファイル内容やAPIキーをCIログへそのまま出力しないでください。
missing解消後に別エラーが出る場合
ファイルを正しい場所へ置いた後、次のエラーへ変わることがあります。
No matching client found for package name
これはファイルを読み込めるようになったものの、現在のapplicationIdとJSON内のpackage_nameが一致していない状態です。
missingエラーとパッケージ名不一致は、別の問題として確認してください。
配置後のビルド
Android:
./gradlew clean
./gradlew assembleDebug
Flutter:
flutter clean
flutter pub get
flutter run
キャッシュ削除は、正しいファイルを配置した後に行います。
まとめ
基本の配置場所は次のとおりです。
Android: app/google-services.json
Flutter・React Native: android/app/google-services.json
flavor: app/src/{flavor}/google-services.json
最初に、エラーを出しているアプリモジュールと、com.google.gms.google-servicesの適用先を特定してください。
一次情報
公式参考資料
Google PlayやFirebaseの画面・要件は変更される場合があります。公開作業の前に、リンク先の最新情報も確認してください。