google-services.jsonは実際には何をしますか?


120

現在のアプリにGoogleアナリティクスとGCMサービスを追加する作業をしています。両方のサービスの実装に関するガイドで、Googleは開発者にjsonファイルgoogle-services.jsonを生成してアプリのルートディレクトリの下に置くように求めています。

このjsonファイルをアプリから削除しても、サービスは引き続き機能することがわかりました。

確かに知りたいのですが、このファイルは本当に何のためのものですか?どのように使用し、どのように機能しますか?

回答:


197

google-servicesプラグインとjsonについて少し調査したところ、このプラグインのソースが見つかりました。

まず最初に

クラスパスによって参照され、applyで参照されるgradle-plugin google-servicesは、ビルド時プラグインのみです!そのため、アプリのビルドプロセスにのみ影響し、ランタイムプロセスには影響しません。

このプラグインは、Googleサービスをアプリにすばやく統合するためのクイックスタートヘルパーとしてのみ意図されています。明らかに、プロセスはやや複雑で文書化されていないので、Googleはこのプロセスが何をするかを明確にすべきでした。

実際、プラグインバージョンcom.google.gms:google-services:1.4.0-beta3のソースコードは見つかりましたが、appinvitesに関する特定の参照は見つかりませんでした。また、App Invites用のGoogle APIも見つかりませんでした。(しかし、多分それはそのプロジェクトIDを持つ一般的なAPIプロジェクトを使用するだけで、私はこれを試しませんでした)

それがすること

google-services gradle-pluginはapp-moduleで前述のgoogle-services.jsonファイルを探します。次に、Google APIデベロッパーコンソールによってgoogle-services.jsonファイルに生成されたプロジェクトIDやトラッキングIDなどの構成済み設定を探します。見つかった設定から、Androidリソース値が次のパスに生成されます。

$project.buildDir/generated/res/google-services/$variant.dirName/values/values.xml

たとえば、アプリのデバッグビルドの場合:

app/build/generated/res/google-services/debug/values/values.xml

たとえば、GCMチュートリアルに従った場合、JSONファイルにはAPIプロジェクトのIDが次のandroid-resourceとして含まれます。

<string name="gcm_defaultSenderId">project-id</string>

したがって、このプラグインとJSONファイルは、アプリの実行や公開に必須ではありません。特定のGoogle API機能を簡単に統合するための基本的なAndroidリソースファイルを生成するためのクイックスタートヘルパーにすぎません。

以下で参照されているソースコードでは、google-servicesプラグインが常にapp / build.gradleで定義されているすべてのapp-variantに対してこれらのandroid-resourcesを生成していることに注意してください。

それが必要ない場合は、生成されたリソースを必要なアプリバリアントで使用し、他のリソースを削除する必要があります。app / build.gradleからgoogle-servicesプラグインapplyを削除することを忘れないでください。そうしないと、すべてのアプリバリアントに対して再生成されます。

しないこと

このプラグインとJSONファイルは、アプリの上記のGoogle機能の内部動作に直接影響しません。GCMやGoogleアナリティクスなどの統合方法に関するdeveloper.android.comの古いチュートリアルをすでに実行している場合は、gradle-plugin google-servicesまたはgoogle-services.jsonファイルを統合する必要さえありません。

ソースを見つけた場所に関する通知

google-services gradle-pluginを統合した後、プロジェクトを同期すると、Gradleはgoogle-services依存関係を次のようなパスに自動的にダウンロードします(Windowsでは、Linuxのhome / .gradleを調べる必要がある場合があります)。

C:\Users\user\.gradle\caches\modules-2\files-2.1\com.google.gms\google-services\1.4.0-beta3\f1580f62e3be313eba041ce19b64fd3f44cf8951\google-services-1.4.0-beta3-sources.jar

このjarファイルを抽出すると、2つのファイルが見つかります。

GoogleServicesPlugin.groovy
GoogleServicesTask.java

gradle-pluginのプレーンなソースコードが含まれています。

GoogleServicesPlugin.groovy

app-variantsの処理やパスの基本的な定義などが含まれています。

GoogleServicesTask.java

実際のタスク定義が含まれています。実際に何が行われるかを確認するには、次のメソッドを探します。

@TaskAction
public void action() throws IOException { 

2
はるかに良い答え。それでも、推奨されるアプローチ(developer.google.com/analytics/devguides/collection/android/v4)を実行しようとすると問題が発生するようです。それを決める...
axd

7
これを投稿してから変更されている可能性があるため、これに関するフォローアップノート。GoogleのサービスのGradleプラグインガイドは、プラグインの第二の機能を述べています。また、「有効にしたサービスに必要な基本ライブラリー」にいくつかの依存関係を追加し、依存関係の衝突をチェックする(バージョンの混合による)と主張しています。ソースを掘り下げたところ、「compile com.google.android.gms:play-services-measurement」が挿入されているようです。だれかがそのポップアップを見て、その理由がわからない場合に備えて、参考までに。
Android3000 2016

3
ファイルにいくつかのキーが含まれていることを考えると、バージョン管理に追加しても安全ですか?私の知る限り、それは指紋だけなので、安全だと思います。しかし、私は完全に確かではありません。
exhuma

1
@exhumaは私の個人的な意見ですが、プライベートプロジェクトまたは社内プロジェクトに取り組んでいる場合は、バージョン管理にチェックインしても問題ありません。一方、オープンソースプロジェクトのバージョン管理にjsonファイルをチェックすることはありません。
arne.jans

1
@ arne.jans senderIdを動的に設定できますか、それともvalues.xmlにハードコードしただけですか?サーバーから送信者IDを動的にフェッチする必要があり、FCMに登録する必要があります。
Bresiu

37

このファイルは本当に何のためのものですか?

google-services.jsonには、GoogleApiClientとの接続中に確認するために必要な開発者の資格情報と構成設定が含まれています。開発者アカウントを検出しているため、サービスはテストデバイスで正常に機能していますが、アプリをパブリックでリリースした後は、jsonファイルがないと機能しません。削除しないでください。

公式ドキュメントは言う:

アプリケーションはGoogleApiClientを作成し、アプリケーションがアクセスするスコープとAPIを指定します。GoogleApiClientが接続すると、ユーザーはサインインします。

どのように動作するかをご覧ください。


3
お返事ありがとうございます。あなたが手伝ってくれるかどうか疑問に思っているだけです。リンクがサインインサービスに投稿されているのを見ました。ただし、アプリでGoogleアナリティクスとGCMサービスのみを使用していて、サインインする必要がない場合でも、このファイルを保持する必要がありますか?ありがとう!
Arthur Wang

3
はい、分析またはGCMの場合、この構成ファイルも必要です。ドキュメントのステップ2では、GET A CONFIGURATION FILEリンクに移動する必要がありました。そこで、このconfファイルをGCMまたは分析に使用するかどうかを選択する必要があります。このファイルには、開発者のID(APIキー、開発用PCのSHA1ハッシュなど)のみが含まれています
Mohammad Arman

2
@androidGuy返信が遅くなってすみません。新しいリリースのgoogle-services.jsonファイルを最新リリースのSHA1キーハッシュで作成する必要があると思います。それ以外の場合、一部の機能は、Playストアで公開した後に機能しない可能性があります。以前の混乱でごめんなさい。誰かが間違った方向に進むことができるので、以前のコメントを削除します。
Mohammad Arman

1
他の人の言葉をコピーする場合は、それらを適切にブロック引用し、完全な帰属を提供する必要あります。私はそれをこの問題の下の答えの盗作だと考えているので、私はあなたの編集をロールバックしました。
ブラッド・ラーソン

6
セキュリティはどうですか?google-services.jsonを再作成してAPKから読み取ることはできますか?内部に開発者とAPIキーが表示されます。私はそれが他の人に知られるのが好きではありません...
Tino

4

google-services.jsonをモジュールに追加し、クリーンアップと再構築を行います。xmlファイルがapp / build / generated / res / google-services / debug / values / values.xmlにプロジェクトプロパティとともに生成され、通常のxml文字列と同様に簡単にアクセスできます。例:

String serverClientId = getString(R.string.default_web_client_id);

google-service.jsonドキュメントにすべての文字列と詳細情報のリストがあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.