Was macht google-services.json wirklich?

120

Ich arbeite daran, meiner aktuellen App Google Analytics- und GCM-Dienste hinzuzufügen. In der Anleitung zur Implementierung beider Dienste fordert Google den Entwickler auf, eine JSON-Datei zu generieren: google-services.json und diese im Stammverzeichnis der App abzulegen.

Ich habe festgestellt, dass die Dienste auch dann funktionieren, wenn ich diese JSON-Datei aus meiner App lösche.

Ich möchte nur sicher wissen, wofür diese Datei wirklich ist. Was ist seine Verwendung und wie funktioniert es?

Arthur Wang
quelle

Antworten:

197

Ich habe ein bisschen nach dem Google-Services-Plugin und json gesucht und die Quellen für dieses Plugin gefunden.

Das wichtigste zuerst

Das Gradle-Plugin Google-Services, auf das durch classpath und mit apply verwiesen wird, ist nur ein Plugin zur Build-Zeit! Es beeinflusst also nur den Erstellungsprozess Ihrer App, nicht aber den Laufzeitprozess!

Dieses Plugin ist nur als Schnellstarthilfe für die schnelle Integration von Google-Diensten in Ihre App gedacht. Offensichtlich ist der Prozess etwas kompliziert und nicht dokumentiert, daher hätte Google klarstellen müssen, was dieser Prozess bewirkt.

Tatsächlich habe ich den Quellcode für die Plugin-Version com.google.gms: google-services: 1.4.0-beta3 gefunden und darin keinen spezifischen Verweis auf Appinvites gefunden, noch habe ich eine Google-API für App-Einladungen gefunden! (Aber vielleicht verwendet es nur ein generisches API-Projekt mit seiner Projekt-ID, ich habe dies nicht versucht)

Was es macht

Das Gradle-Plugin von google-services sucht in Ihrem App-Modul nach der genannten Datei google-services.json. Anschließend wird nach konfigurierten Einstellungen wie Projekt-IDs und Tracking-IDs usw. gesucht, die von der Google API-Entwicklerkonsole in der Datei google-services.json generiert wurden. Aus den gefundenen Einstellungen werden Android-Ressourcenwerte in den folgenden Pfad generiert:

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

Zum Beispiel für einen Debug-Build Ihrer App:

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

Wenn Sie beispielsweise dem GCM-Lernprogramm folgen, enthält die JSON-Datei die ID des API-Projekts als folgende Android-Ressource:

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

Daher sind dieses Plugin und diese JSON-Datei nicht unbedingt erforderlich, um Ihre App auszuführen oder zu veröffentlichen. Es ist lediglich ein Schnellstart-Hilfsprogramm zum Generieren einiger grundlegender Android-Ressourcendateien zur einfacheren Integration bestimmter Google API-Funktionen.

Beachten Sie im Quellcode, auf den unten verwiesen wird, dass das Google-Services-Plugin immer diese Android-Ressourcen für jede App-Variante generiert, die in Ihrer app / build.gradle definiert ist.

Wenn Sie das nicht möchten, sollten Sie diese generierten Ressourcen in den gewünschten App-Varianten verwenden und die anderen löschen. Vergessen Sie nicht, das Google-Services-Plugin aus app / build.gradle zu entfernen, da es sonst für alle App-Varianten neu generiert wird.

Was es nicht tut

Dieses Plugin und die JSON-Datei haben KEINEN direkten Einfluss auf das Innenleben der genannten Google-Funktionen für Ihre App! Wenn Sie bereits älteren Tutorials auf developer.android.com zum Integrieren von z. B. GCM oder Google Analytics gefolgt sind, müssen Sie weder das Gradle-Plugin google-services noch die Datei google-services.json integrieren!

Beachten Sie, wo ich die Quellen gefunden habe

Nachdem Sie das Google Services-Gradle-Plugin integriert und Ihr Projekt synchronisiert haben, lädt Gradle die Google Services-Abhängigkeit automatisch auf einen ähnlichen Pfad herunter (unter Windows müssen Sie möglicherweise in Ihr Home / .gradle für Linux schauen):

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

Wenn Sie diese JAR-Datei extrahieren, finden Sie zwei Dateien:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

die den einfachen Quellcode des Gradle-Plugins enthalten.

GoogleServicesPlugin.groovy

enthält die Handhabung der App-Varianten und grundlegende Definitionen von Pfaden etc.

GoogleServicesTask.java

Enthält die eigentliche Aufgabendefinition. Suchen Sie nach der folgenden Methode, um zu sehen, was sie wirklich tut:

@TaskAction
public void action() throws IOException { 
arne.jans
quelle
2
viel bessere Antwort. Dennoch scheint es Probleme zu geben, wenn versucht wird, dem empfohlenen Ansatz zu folgen ( developer.google.com/analytics/devguides/collection/android/v4 ). "Akzeptierte Antwort" ist ein lächerliches SO-Konzept, das völlig von der Geduld der Person abhängt, die dies kann Entscheide
dich
7
Ein Hinweis dazu, da er sich möglicherweise geändert hat, seit Sie dies veröffentlicht haben. Das Google Services Gradle Plugin- Handbuch enthält eine zweite Funktion des Plugins. Es wird auch behauptet, einige Abhängigkeiten für "Basisbibliotheken, die für die von Ihnen aktivierten Dienste erforderlich sind" sowie Überprüfungen auf Abhängigkeitskollisionen (durch Versionsmischung) hinzuzufügen. Ich habe mich in die Quellen vertieft und es scheint auch "compile com.google.android.gms: play-services-Measurement" zu injizieren. Nur zu Ihrer Information, falls jemand das sieht und nicht sicher ist warum.
Android3000
3
Ist es angesichts der Tatsache, dass die Datei einige Schlüssel enthält, sicher, sie der Versionskontrolle hinzuzufügen? Soweit ich das beurteilen kann, handelt es sich nur um Fingerabdrücke, daher halte ich es für sicher. Aber ich bin nicht ganz sicher.
Exhuma
1
@exhuma meiner persönlichen Meinung nach, wenn Sie an einem privaten oder unternehmensinternen Projekt arbeiten, wäre es in Ordnung, es in die Versionskontrolle einzuchecken. Andererseits würde ich die json-Datei natürlich nie in die Versionskontrolle für Open Source-Projekte einchecken.
Arne.jans
1
@ arne.jans Können Sie die senderId dynamisch festlegen oder haben Sie sie einfach in values.xml fest codiert? Ich muss senderId dynamisch vom Server abrufen und mich dann bei FCM registrieren.
Bresiu
37

Wofür ist diese Datei wirklich:

google-services.json enthält Entwickleranmeldeinformationen und Konfigurationseinstellungen, die zur Überprüfung während der Verbindung mit GoogleApiClient erforderlich sind. Obwohl Ihr Dienst mit Ihrem Testgerät einwandfrei funktioniert, da er Ihr Entwicklerkonto erkennt, funktioniert er nach der Veröffentlichung Ihrer App in der Öffentlichkeit nicht ohne die JSON-Datei. Also nicht löschen.

Die offizielle Dokumentation sagt:

Die Anwendung erstellt einen GoogleApiClient und gibt an, auf welche Bereiche und APIs die Anwendung zugreifen soll. Wenn der GoogleApiClient eine Verbindung herstellt, ist der Benutzer angemeldet.

Siehe den Abschnitt, wie es funktioniert .

Mohammad Arman
quelle
3
Vielen Dank für Ihre Antwort. Ich habe nur Fragen, frage mich aber, ob Sie bereit sind zu helfen. Ich habe gesehen, dass Ihr Link zu den Anmeldediensten gehört. Wenn ich jedoch nur den Google Analytics- und GCM-Dienst in meiner App verwende und mich nicht anmelden muss, muss ich diese Datei trotzdem aufbewahren? Vielen Dank!
Arthur Wang
3
Ja, für Analytics oder GCM benötigen Sie auch diese Konfigurationsdatei. In Schritt 2 der Dokumentation mussten Sie zum Link GET A CONFIGURATION FILE gehen . Dort müssen Sie auswählen, ob Sie diese conf-Datei für GCM oder Analytics verwenden. Diese Datei enthält nur Ihre Entwickleridentität (wie API-Schlüssel, SHA1-Hash Ihres Entwicklungs-PCs usw.)
Mohammad Arman
2
@androidGuy Entschuldigung für die späte Antwort. Ich denke, Sie müssen die neue Konfigurationsdatei google-services.json mit der neuesten Version SHA1 keyhash erstellen. Andernfalls funktionieren einige Funktionen möglicherweise nicht, nachdem sie im Play Store veröffentlicht wurden. Entschuldigung für die vorherige Verwirrung, ich werde meinen vorherigen Kommentar löschen, da dadurch jemand in die falsche Richtung geht.
Mohammad Arman
1
Wenn Sie die Wörter einer anderen Person kopieren, müssen Sie sie ordnungsgemäß blockieren und eine vollständige Zuordnung vornehmen. Ich habe Ihre Bearbeitung zurückgesetzt, da ich sie als Plagiat der Antwort unter dieser betrachte.
Brad Larson
6
Was ist mit Sicherheit? Kann google-services.json neu erstellt und von der apk gelesen werden? Ich sehe einen Entwickler- und API-Schlüssel darin. Ich mag es nicht, wenn es anderen bekannt ist ...
Tino
4

Fügen Sie Ihrem Modul google-services.json hinzu und führen Sie CLEAN und A REBUILD durch. Eine XML-Datei wird in app / build / generate / res / google-services / debug / values ​​/ values.xml mit Ihren Projekteigenschaften generiert, und Sie können dann wie bei einer normalen XML-Zeichenfolge problemlos darauf zugreifen. Beispiel:

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

Es gibt eine Liste mit allen Zeichenfolgen und weiteren Informationen in google-service.json doc

Beto Caldas
quelle