Que fait vraiment google-services.json?

120

Je travaille sur l'ajout de services Google Analytics et GCM à mon application actuelle. Sur le guide de mise en œuvre des deux services, Google demande au développeur de générer un fichier json: google-services.json et de le placer sous le répertoire racine de l'application.

J'ai trouvé que même si je supprime ce fichier json de mon application, les services fonctionnent toujours.

Vous voulez juste savoir à quoi sert vraiment ce fichier? Quelle est son utilisation et comment ça marche?

Arthur Wang
la source

Réponses:

197

J'ai étudié un peu le plugin google-services et json et j'ai trouvé les sources de ce plugin.

Tout d'abord

Le google-services gradle-plugin qui est référencé par classpath et avec apply est un plugin de construction uniquement! Cela n'influence donc que le processus de construction de votre application, mais pas le processus d'exécution!

Ce plugin est uniquement conçu comme une aide au démarrage rapide pour intégrer rapidement les services Google dans votre application. De toute évidence, le processus est quelque peu compliqué et non documenté, donc Google aurait dû expliquer clairement ce que fait ce processus.

En fait, j'ai trouvé le code source de la version du plugin com.google.gms: google-services: 1.4.0-beta3 et je n'y ai trouvé aucune référence spécifique concernant les invitations d'applications et je n'ai trouvé aucune API Google pour les invitations d'application! (Mais peut-être qu'il utilise juste un projet d'API générique avec son identifiant de projet, je n'ai pas essayé cela)

Ce qu'il fait

Le plugin gradle google-services recherche le fichier google-services.json mentionné dans votre module d'application. Ensuite, il recherche les paramètres configurés tels que les ID de projet et de suivi, etc., générés par la console de développement de l'API Google dans le fichier google-services.json. À partir des paramètres trouvés, les valeurs des ressources Android sont générées dans le chemin suivant:

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

Par exemple, pour une version de débogage de votre application:

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

Par exemple, si vous avez suivi le didacticiel GCM, le fichier JSON inclurait l'ID du projet d'API en tant que ressource android suivante:

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

Ainsi, ce plugin et ce fichier JSON ne sont pas essentiels pour exécuter ou publier votre application, il s'agit simplement d'un assistant de démarrage rapide pour générer des fichiers de ressources Android de base pour une intégration plus facile des fonctionnalités spécifiques de l'API Google.

Notez dans le code source référencé ci-dessous que le plugin google-services génère toujours ces ressources android pour chaque variante d'application définie dans votre app / build.gradle.

Si vous ne le souhaitez pas, vous devez utiliser ces ressources générées dans les variantes d'application souhaitées et supprimer les autres. N'oubliez pas de supprimer le plugin google-services apply de app / build.gradle, sinon il sera régénéré pour toutes les variantes d'application.

Ce que ça ne fait pas

Ce plugin et ce fichier JSON n'influencent PAS directement le fonctionnement interne desdites fonctionnalités Google pour votre application! Si vous avez déjà suivi d'anciens tutoriels sur developer.android.com sur la façon d'intégrer par exemple GCM ou Google Analytics, vous n'avez même pas besoin d'intégrer le fichier google-services gradle-plugin ou le fichier google-services.json!

Remarquez où j'ai trouvé les sources

Après avoir intégré le plugin google-services gradle-plugin et lors de la synchronisation de votre projet, Gradle télécharge automatiquement la dépendance google-services vers un chemin similaire à celui-ci (sous Windows, vous devrez peut-être regarder dans votre home / .gradle pour Linux):

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

Si vous extrayez ce fichier jar, vous trouverez deux fichiers:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

qui contiennent le code source brut du plugin gradle.

GoogleServicesPlugin.groovy

contient la gestion des variantes d'application et des définitions de base des chemins, etc.

GoogleServicesTask.java

contient la définition de tâche réelle, recherchez la méthode suivante pour voir ce qu'elle fait vraiment:

@TaskAction
public void action() throws IOException { 
arne.jans
la source
2
réponse bien meilleure. pourtant il semble y avoir des problèmes en essayant de suivre l'approche recommandée ( développeurs.google.com /analytics/devguides/collection/android/v4) "réponse acceptée" est un concept SO ridicule qui dépend totalement de la patience de la personne qui peut décidez-le ...
axd
7
Une note de suivi à ce sujet, car il a peut-être changé depuis que vous l'avez publié. Le guide Google Services Gradle Plugin indique une deuxième fonction du plugin. Il prétend également ajouter des dépendances pour les «bibliothèques de base requises pour les services que vous avez activés», ainsi que des vérifications des collisions de dépendances (à partir du mélange de versions). J'ai fouillé dans les sources, et il semble également injecter "compile com.google.android.gms: play-services-Measurement". Juste un FYI au cas où quelqu'un verrait cela apparaître et ne serait pas sûr de savoir pourquoi.
Android3000
3
Étant donné que le fichier contient quelques clés, est-il sûr de l'ajouter au contrôle de version? Autant que je sache, ce ne sont que des empreintes digitales, donc je pense que c'est sûr. Mais je ne suis pas complètement sûr.
exhuma
1
@exhuma à mon avis personnel, si vous travaillez sur un projet privé ou interne à l'entreprise, ce serait correct de le vérifier dans le contrôle de version. D'un autre côté, je ne vérifierais jamais le fichier json dans le contrôle de version pour les projets open source, évidemment.
arne.jans
1
@ arne.jans Pouvez-vous définir le senderId de manière dynamique, ou vous l'avez simplement codé en dur dans values.xml? J'ai besoin de récupérer senderId dynamiquement à partir du serveur et de m'inscrire à FCM.
Bresiu
37

A quoi sert vraiment ce fichier:

google-services.json contient les informations d'identification du développeur et les paramètres de configuration, qui sont nécessaires pour la vérification lors de la connexion à GoogleApiClient. Bien que votre service fonctionne correctement avec votre appareil de test, car il détecte votre compte de développeur, mais après avoir publié votre application en public, il ne fonctionnera pas sans le fichier json. Alors ne le supprimez pas.

La documentation officielle dit:

L'application crée un GoogleApiClient, spécifiant les étendues et les API auxquelles l'application accédera. Lorsque GoogleApiClient se connecte, l'utilisateur est connecté.

Voir la section comment ça marche .

Mohammad Arman
la source
3
Merci pour votre réponse. J'ai juste des questions à me demander si vous êtes prêt à aider. J'ai vu que votre lien était une publication vers les services de connexion. Mais si j'utilise uniquement Google Analytics et le service GCM dans mon application, je n'ai pas besoin de me connecter, dois-je quand même conserver ce fichier? Merci!
Arthur Wang
3
Oui, pour l'analyse ou GCM, vous avez également besoin de ce fichier de configuration. A l'étape 2 de la documentation, il fallait aller sur le lien OBTENIR UN FICHIER DE CONFIGURATION . Là, vous devez sélectionner si vous utilisez ce fichier de configuration pour GCM ou analytique. Ce fichier contient juste votre identité de développeur (comme la clé api, le hachage SHA1 de votre PC de développement, etc.)
Mohammad Arman
2
@androidGuy Désolé pour la réponse tardive. Je pense que vous devez créer le nouveau fichier de configuration google-services.json avec la dernière version de keyhash SHA1. Sinon, certaines fonctionnalités peuvent ne pas fonctionner après la publication sur le Play Store. Désolé pour la confusion précédente, je supprimerai mon commentaire précédent car il laissera quelqu'un dans la mauvaise direction.
Mohammad Arman
1
Si vous copiez les mots d'une autre personne, vous devez les bloquer correctement et fournir une attribution complète. J'ai annulé votre modification, car je considère qu'il s'agit d'un plagiat de la réponse ci-dessous.
Brad Larson
6
Et la sécurité? Google-services.json peut-il être recréé et lu à partir de l'apk? Je vois un développeur et une clé API à l'intérieur. Je n'aime pas qu'il soit connu des autres ...
Tino
4

Ajoutez google-services.json à votre module et effectuez un nettoyage et une reconstruction. Un fichier xml sera généré dans app / build / generated / res / google-services / debug / values ​​/ values.xml avec les propriétés de votre projet et vous pouvez facilement y accéder comme une chaîne xml normale. Exemple:

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

il y a une liste avec toutes les chaînes et plus d'informations dans google-service.json doc

Beto Caldas
la source