google-services.jsonは、AndroidアプリとFirebaseプロジェクトを結び付ける構成ファイルです。
ファイルを間違えると、ビルドエラーだけでなく、意図しないFirebaseプロジェクトへデータを送信する問題も起こります。
- Firestoreにデータが表示されない
- 別のプロジェクトへユーザーが登録される
- Googleログインが動かない
- Cloud Messagingの通知が届かない
No matching client found for package nameが表示されるgoogle-services.json is missingが表示される
まず、ファイルが何を持ち、ビルド時にどう使われるかを理解します。
google-services.jsonの役割
FirebaseコンソールへAndroidアプリを登録すると、そのアプリ用のgoogle-services.jsonを取得できます。
主な情報は次のとおりです。
- FirebaseプロジェクトID
- Google Cloudプロジェクト番号
- FirebaseアプリID
- Androidパッケージ名
- Firebase向けAPIキー
- OAuthクライアント情報
- Storageバケット等の設定
Google Services Gradle Pluginは、JSONを読み込み、Firebase SDKが参照するAndroidリソースへ変換します。
google-services.json
↓
Google Services Gradle Plugin
↓
google_app_id / project_id / APIキー等を生成
↓
Firebase SDKが初期化に利用
秘密鍵ではない
google-services.jsonにはプロジェクト固有の情報が入っていますが、Firebaseの管理者秘密鍵ではありません。
ファイルを隠すことだけでは、FirestoreやStorageのデータを保護できません。
必要な対策は次のとおりです。
- Firebase Authentication
- Firestore Security Rules
- Realtime Database Rules
- Storage Security Rules
- Firebase App Check
- APIキーの適切な制限
次の情報をJSONへ追加してはいけません。
- サービスアカウント秘密鍵
- 外部APIのシークレット
- 決済サービスの秘密鍵
- 管理者用トークン
- OAuthクライアントシークレット
Androidでの配置場所
一般的なAndroidプロジェクトでは、アプリモジュールの直下へ配置します。
project/
├── app/
│ ├── google-services.json
│ ├── build.gradle.kts
│ └── src/
├── build.gradle.kts
└── settings.gradle.kts
正しい基本パス:
app/google-services.json
プロジェクト全体のルートではありません。
間違った例
project/google-services.json
project/config/google-services.json
ダウンロードフォルダに置いたままでも、Gradleは読み込みません。
Flutterでの配置場所
FlutterプロジェクトのAndroidアプリモジュールは通常、android/app/です。
flutter_project/
├── android/
│ └── app/
│ ├── google-services.json
│ └── build.gradle.kts
├── lib/
└── pubspec.yaml
基本パス:
android/app/google-services.json
現在のFlutterFireでは、次のコマンドでプラットフォーム設定を構成します。
flutterfire configure
これにより、通常は次のファイルも生成されます。
lib/firebase_options.dart
Flutterでは、Android側のJSONとDart側のFirebaseOptionsが同じFirebaseプロジェクトを指しているか確認してください。
React Nativeでの配置場所
一般的なベアReact Nativeプロジェクトでも、Androidアプリモジュールはandroid/app/です。
android/app/google-services.json
ExpoやEAS Buildでは、app configのandroid.googleServicesFileからファイルパスを指定する構成があります。ビルド方式に応じて、最終的なAndroidプロジェクトへ正しいファイルが渡されているか確認します。
ファイル名を確認する
同じファイルを何度もダウンロードすると、OSが名前を変更する場合があります。
google-services (1).json
google-services (2).json
使用する名前は次のとおりです。
google-services.json
Windowsでは拡張子が隠れ、実際には次のようになっている場合もあります。
google-services.json.txt
google-services.json.json
拡張子を表示して確認してください。
パッケージ名を確認する
JSON内には、Firebaseへ登録したAndroidパッケージ名があります。
{
"client": [
{
"client_info": {
"android_client_info": {
"package_name": "com.example.app"
}
}
}
]
}
Gradle側の最終的なapplicationIdと一致させます。
android {
defaultConfig {
applicationId = "com.example.app"
}
}
namespaceではなくapplicationIdを確認する
android {
namespace = "com.example.app.code"
defaultConfig {
applicationId = "com.example.app"
}
}
Firebaseへ登録する値は、通常、端末とGoogle Playでアプリを識別するapplicationIdです。
接続先Firebaseプロジェクトを確認する
google-services.jsonをテキストエディタで開き、project_idを確認します。
{
"project_info": {
"project_id": "example-app-prod"
}
}
Firebaseコンソールで開いているプロジェクトIDと一致するか確認してください。
表示名ではなく、一意のproject_idを基準にします。
主な確認項目
| JSON項目 | 確認内容 |
|---|---|
project_id | 接続先のFirebaseプロジェクト |
project_number | Google Cloud・FCMで使われる番号 |
mobilesdk_app_id | Firebaseへ登録された個別アプリID |
package_name | Androidのapplication ID |
current_key | 自動的に対応付けられたAPIキー |
APIキーだけで判断せず、project_idとpackage_nameも一緒に確認します。
Gradleプラグインを設定する
JSONを置くだけでなく、アプリモジュールへGoogle Services Pluginを適用します。
Kotlin DSL
plugins {
id("com.android.application")
id("com.google.gms.google-services")
}
プロジェクトレベルでは、公式セットアップに記載された現行バージョンを宣言します。
plugins {
id("com.google.gms.google-services") version "現行バージョン" apply false
}
プラグインがJSONを処理すると、次のような生成物が作られます。
app/build/generated/res/google-services/
生成されたvalues.xmlには、google_app_idやproject_idなどが含まれます。
開発環境と本番環境を分ける
product flavorを使用する場合、環境ごとに構成ファイルを配置できます。
app/
└── src/
├── development/
│ └── google-services.json
└── production/
└── google-services.json
例:
development
applicationId: com.example.app.dev
Firebase: example-app-dev
production
applicationId: com.example.app
Firebase: example-app-prod
環境別に分ける場合、ファイル名だけでなく、それぞれのproject_idとpackage_nameを確認してください。
再ダウンロードする場面
次の変更を行ったときは、Firebaseコンソールから最新版を取得するか、FlutterFireの構成を更新します。
- 新しいAndroidアプリをFirebaseへ登録した
- Googleログイン用のSHA-1を追加した
- OAuthクライアント設定を変更した
- 別のFirebaseプロジェクトへ切り替えた
- 新しいproduct flavorを追加した
- APIキーの構成を変更した
- Flutterで対象プラットフォームやFirebase製品を追加した
Googleログインを設定した場合は、OAuthクライアント情報が更新されるため、最新の構成ファイルを取得します。
ファイルを置き換えた後のビルド
Android
./gradlew clean
./gradlew assembleDebug
App Bundleの場合:
./gradlew clean
./gradlew bundleRelease
Flutter
flutterfire configure
flutter clean
flutter pub get
flutter run
Google Playへ更新版を出す場合は、versionCodeも増やします。
代表的なエラー
File google-services.json is missing
主な確認項目:
- ファイルが存在するか
- アプリモジュール直下か
- ファイル名が正しいか
- CIでファイルを復元しているか
- build type・flavor用の配置があるか
No matching client found for package name
主な確認項目:
- Gradleの最終
applicationId - JSONの
package_name applicationIdSuffix- 選択中のbuild variant
- 正しいFirebase Androidアプリから取得したファイルか
データが別プロジェクトへ保存される
主な確認項目:
project_id- build variant
- flavor用JSONの配置
- Flutterの
firebase_options.dart - CIで復元したファイル
CIでの取り扱い
google-services.jsonをGitへ含めない運用では、CIでビルド前に復元します。
- name: Restore google-services.json
run: |
mkdir -p android/app
echo "${{ secrets.GOOGLE_SERVICES_JSON_BASE64 }}" \
| base64 --decode \
> android/app/google-services.json
復元後にファイルの存在とproject_idを検証すると、開発用・本番用の取り違えを減らせます。
ファイルの中身をCIログへそのまま出力しないでください。
よくある誤解
JSONを手で編集すれば別アプリに使える
package_nameだけを書き換える方法は避けてください。
FirebaseアプリID、OAuthクライアント、APIキーなど複数の情報が対応しているため、正しいAndroidアプリをFirebaseへ登録して正式なファイルを取得します。
JSONを差し替えればデータも移動する
移動しません。
新しくビルドしたアプリの接続先が変わるだけです。Firestore、Authentication、Storageなどの既存データは、必要に応じて別途移行します。
APIキーを隠せばデータを保護できる
Firebaseデータの保護には、Security Rules、Authentication、App Checkなどが必要です。
まとめ
google-services.jsonで確認する基本は次のとおりです。
- 正しいFirebaseプロジェクトから取得する
- 正しいアプリモジュールへ配置する
- ファイル名を正確にする
applicationIdとpackage_nameを一致させるproject_idで接続先を確認する- Google Services Gradle Pluginを適用する
- flavorごとに接続先を分ける
- OAuthやSHA変更後は最新版を取得する
- FlutterではFirebaseOptionsも更新する
- 差し替え後にクリーンビルドする
接続エラーが起きた場合は、ファイルを何度も入れ直す前に、project_id、package_name、配置場所、build variantを順番に確認してください。
一次情報
公式参考資料
- Firebase:AndroidプロジェクトへFirebaseを追加する
- Google Developers:Google Services Gradle Plugin
- Firebase:FlutterでFirebaseを設定する
Google PlayやFirebaseの画面・要件は変更される場合があります。公開作業の前に、リンク先の最新情報も確認してください。