¿Qué hace realmente google-services.json?

120

Trabajo para agregar servicios de Google Analytics y GCM a mi aplicación actual. En la guía para la implementación de ambos servicios, Google le pide al desarrollador que genere un archivo json: google-services.json y lo coloque en el directorio raíz de la aplicación.

Descubrí que incluso si elimino este archivo json de mi aplicación, los servicios aún funcionan.

Solo quiero saber con certeza, ¿para qué es realmente este archivo? ¿Cuál es su uso y cómo funciona?

Arthur Wang
fuente

Respuestas:

197

Investigué un poco sobre el complemento de servicios de Google y json y encontré las fuentes de este complemento.

Lo primero es lo primero

El gradle-plugin google-services al que hace referencia classpath y con apply es solo un complemento en tiempo de compilación. Por lo tanto, solo influye en el proceso de compilación de su aplicación, ¡pero no en el proceso de ejecución!

Este complemento solo sirve como ayuda de inicio rápido para integrar los servicios de Google rápidamente en su aplicación. Obviamente, el proceso es algo complicado y no está documentado, por lo que Google debería haber dejado en claro lo que hace este proceso.

De hecho, encontré el código fuente para la versión del complemento com.google.gms: google-services: 1.4.0-beta3 y no encontré ninguna referencia específica en él con respecto a las invitaciones a aplicaciones, ¡ni encontré ninguna API de Google para invitaciones a aplicaciones! (Pero tal vez solo use un proyecto de API genérico con su ID de proyecto, no probé esto)

Que hace

Google-services gradle-plugin busca el archivo google-services.json mencionado en su módulo de aplicación. Luego busca configuraciones configuradas como project-id's y tracking-id's y demás, generadas por la consola de desarrollo de la API de Google en el archivo google-services.json. A partir de la configuración que encontró, los valores de los recursos de Android se generan en la siguiente ruta:

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

Por ejemplo, para una compilación de depuración de su aplicación:

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

Por ejemplo, si siguió el tutorial de GCM, el archivo JSON incluiría el ID del proyecto de API como el siguiente recurso de Android:

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

Por lo tanto, este complemento y el archivo JSON no son esenciales para ejecutar o publicar su aplicación, es solo una ayuda de inicio rápido para generar algunos archivos básicos de recursos de Android para una integración más fácil de funciones específicas de la API de Google.

Observe en el código fuente al que se hace referencia a continuación que el complemento de servicios de Google siempre genera esos recursos de Android para cada variante de aplicación que se define en su aplicación / build.gradle.

Si no desea eso, debe usar esos recursos generados en las variantes de aplicación que desee y eliminar los demás. No olvide eliminar la aplicación del complemento de servicios de Google de app / build.gradle, de lo contrario, se volverá a generar para todas las variantes de la aplicación.

Lo que no

¡Este complemento y el archivo JSON NO influyen directamente en el funcionamiento interno de dichas funciones de Google para su aplicación! Si ya ha seguido los tutoriales anteriores en developer.android.com sobre cómo integrar, por ejemplo, GCM o Google Analytics, entonces ni siquiera necesita integrar el archivo gradle-plugin google-services o google-services.json.

Observe dónde encontré las fuentes.

Después de integrar el complemento gradle de google-services y cuando sincroniza su proyecto, Gradle descarga automáticamente la dependencia de google-services a una ruta similar a esta (en Windows, es posible que deba buscar en su hogar / .gradle para 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 extrae este archivo jar, encontrará dos archivos:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

que contienen el código fuente simple del complemento gradle.

GoogleServicesPlugin.groovy

contiene el manejo de las variantes de la aplicación y las definiciones básicas de rutas, etc.

GoogleServicesTask.java

contiene la definición de tarea real, busque el siguiente método para ver lo que realmente hace:

@TaskAction
public void action() throws IOException { 
arne.jans
fuente
2
mucho mejor respuesta. sin embargo, parece haber problemas al intentar seguir el enfoque recomendado ( developers.google.com/analytics/devguides/collection/android/v4 ) "respuesta aceptada" es un concepto de SO ridículo que depende totalmente de la paciencia de la persona que puede decidir sobre ello ...
axd
7
Una nota de seguimiento sobre esto, ya que puede haber cambiado desde que lo publicó. La guía del complemento de Google Services Gradle establece una segunda función del complemento. También afirma agregar algunas dependencias para "bibliotecas básicas necesarias para los servicios que ha habilitado", así como verificaciones de colisiones de dependencias (de la mezcla de versiones). Busqué en las fuentes y también parece inyectar "compile com.google.android.gms: play-services-Measurement". Solo un FYI en caso de que alguien vea esa ventana emergente y no esté seguro de por qué.
Android3000
3
Teniendo en cuenta que el archivo contiene un par de claves, ¿es seguro agregarlo al control de versiones? Por lo que puedo decir, son solo huellas digitales, así que creo que es seguro. Pero no estoy completamente seguro.
exhuma
1
@exhuma, en mi opinión personal, si estás trabajando en un proyecto privado o interno de la empresa, estaría bien verificarlo en el control de versiones. Por otro lado, nunca verificaría el archivo json en el control de versiones para proyectos de código abierto, obviamente.
arne.jans
1
@ arne.jans ¿Puede establecer el senderId dinámicamente o simplemente lo codificó en valores.xml? Necesito obtener senderId dinámicamente desde el servidor y luego registrarme en FCM.
Bresiu
37

¿Para qué es realmente este archivo?

google-services.json contiene credenciales de desarrollador y ajustes de configuración, que es necesario verificar al conectarse con GoogleApiClient. Aunque su servicio funciona bien con su dispositivo de prueba, ya que detecta su cuenta de desarrollador, pero después de lanzar su aplicación en público, no funcionará sin el archivo json. Así que no lo elimines.

La Documentación Oficial dice:

La aplicación crea un GoogleApiClient, especificando a qué ámbitos y API accederá la aplicación. Cuando GoogleApiClient se conecta, el usuario inicia sesión.

Vea la sección de cómo funciona .

Mohammad Arman
fuente
3
Gracias por su respuesta. Solo tiene preguntas, aunque me pregunto si está dispuesto a ayudar. Vi que su enlace es una publicación para los servicios de inicio de sesión. Pero si solo utilizo Google Analytics y el servicio GCM en mi aplicación, no necesito iniciar sesión, ¿debo conservar este archivo? ¡Gracias!
Arthur Wang
3
Sí, para análisis o GCM también necesita este archivo de configuración. En el paso 2 de la documentación, tenía que ir al enlace OBTENER UN ARCHIVO DE CONFIGURACIÓN . Allí debe seleccionar si está utilizando este archivo conf para GCM o análisis. Este archivo solo contiene su identidad de desarrollador (como la clave api, el hash SHA1 de su PC de desarrollo, etc.)
Mohammad Arman
2
@androidGuy Perdón por la respuesta tardía. Creo que debe crear el nuevo archivo de configuración google-services.json con la última versión de keyhash SHA1. De lo contrario, es posible que algunas características no funcionen después de publicarlas en Play Store. Perdón por la confusión anterior, eliminaré mi comentario anterior ya que dejará a alguien en la dirección equivocada.
Mohammad Arman
1
Si copia las palabras de otra persona, debe citarlas correctamente y proporcionar una atribución completa. He revertido su edición, ya que considero que es un plagio de la respuesta debajo de esta.
Brad Larson
6
¿Y la seguridad? ¿Se puede recrear y leer google-services.json desde el apk? Veo un desarrollador y una clave API adentro. No me gusta que otros lo conozcan ...
Tino
4

Agregue google-services.json a su módulo y realice una LIMPIEZA y UNA RECONSTRUCCIÓN. Se generará un archivo xml en app / build / generate / res / google-services / debug / values ​​/ values.xml con las propiedades de su proyecto y podrá acceder fácilmente a la cadena xml normal. Ejemplo:

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

hay una lista con todas las cadenas y más información en google-service.json doc

Beto Caldas
fuente