Cosa fa veramente google-services.json?


120

Lavoro per aggiungere i servizi Google Analytics e GCM alla mia app attuale. Nella guida per l'implementazione di entrambi i servizi, Google chiede allo sviluppatore di generare un file json: google-services.json e di inserirlo nella directory principale dell'app.

Ho scoperto che anche se elimino questo file json dalla mia app, i servizi continuano a funzionare.

Voglio solo sapere con certezza, a cosa serve veramente questo file? Qual è il suo utilizzo e come funziona?

Risposte:


197

Ho studiato un po 'per quanto riguarda il plug-in dei servizi di Google e json e ho trovato le fonti di questo plug-in.

Cominciando dall'inizio

Il gradle-plugin google-services a cui fa riferimento classpath e con apply è solo un plugin in fase di compilazione! Quindi influenza solo il processo di compilazione della tua app, ma non il processo di runtime!

Questo plug-in è inteso solo come un aiuto rapido per integrare rapidamente i servizi di Google nella tua app. Ovviamente, il processo è alquanto complicato e non documentato, quindi Google avrebbe dovuto chiarire cosa fa questo processo.

In effetti, ho trovato il codice sorgente per la versione del plugin com.google.gms: google-services: 1.4.0-beta3 e non ho trovato alcun riferimento specifico per quanto riguarda appinvites né ho trovato alcuna API di Google per App Invites! (Ma forse utilizza solo un progetto API generico con il suo ID progetto, non l'ho provato)

Cosa fa

Il plug-in gradle di google-services cerca il file google-services.json menzionato nel tuo modulo-app. Quindi cerca le impostazioni configurate come project-id e tracking-id e simili, generate dalla console per sviluppatori API di Google nel file google-services.json. Dalle impostazioni trovate, i valori delle risorse Android vengono generati nel seguente percorso:

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

Ad esempio per una build di debug della tua app:

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

Ad esempio, se hai seguito il tutorial GCM, il file JSON includerà l'ID del progetto API come la seguente risorsa Android:

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

Quindi questo plug-in e il file JSON non sono essenziali per eseguire o pubblicare la tua app, è solo un aiuto rapido per generare alcuni file di risorse Android di base per una più facile integrazione di specifiche funzionalità API di Google.

Si noti nel codice sorgente a cui si fa riferimento di seguito che il plug-in dei servizi di Google genera sempre quelle risorse Android per ogni variante di app definita nella propria app / build.gradle.

Se non lo desideri, dovresti utilizzare le risorse generate nelle varianti dell'app che desideri ed eliminare le altre. Non dimenticare di rimuovere il plug-in dei servizi di Google si applica da app / build.gradle, altrimenti verrà rigenerato per tutte le varianti dell'app.

Cosa non fa

Questo plugin e il file JSON NON influenzano direttamente il funzionamento interno di dette funzionalità di Google per la tua app! Se hai già seguito tutorial precedenti su developer.android.com su come integrare, ad esempio GCM o Google Analytics, non hai nemmeno bisogno di integrare né il gradle-plugin google-services né il file google-services.json!

Avviso su dove ho trovato le fonti

Dopo aver integrato il plug-in gradle di google-services e sincronizzato il progetto, Gradle scarica automaticamente la dipendenza di google-services in un percorso simile a questo (su Windows, potrebbe essere necessario guardare nella tua home / .gradle per 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

Se estrai questo file jar, troverai due file:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

che contengono il semplice codice sorgente del plugin gradle.

GoogleServicesPlugin.groovy

contiene la gestione delle varianti dell'app e le definizioni di base dei percorsi, ecc.

GoogleServicesTask.java

contiene l'effettiva definizione dell'attività, cerca il seguente metodo per vedere cosa fa veramente:

@TaskAction
public void action() throws IOException { 

2
risposta molto migliore. eppure sembrano esserci problemi quando si cerca di seguire l'approccio consigliato ( developers.google.com/analytics/devguides/collection/android/v4 ) "risposta accettata" è un ridicolo concetto SO che dipende totalmente dalla pazienza della persona che può decidere su di esso ...
axd

7
Una nota di follow-up su questo, poiché potrebbe essere cambiato da quando hai pubblicato questo. La guida del plugin Google Services Gradle indica una seconda funzione del plugin. Afferma inoltre di aggiungere alcune dipendenze per "le librerie di base richieste per i servizi che hai abilitato", così come i controlli per le collisioni di dipendenze (dal mix di versioni). Ho approfondito i sorgenti e sembra anche inserire "compile com.google.android.gms: play-services-measure". Solo un FYI nel caso qualcuno lo veda apparire e non sia sicuro del perché.
Android3000

3
Considerando che il file contiene un paio di chiavi, è sicuro aggiungerlo al controllo della versione? Per quanto ne so sono solo le impronte digitali, quindi credo sia sicuro. Ma non ne sono completamente certo.
exhuma

1
@exhuma a mio parere personale, se stai lavorando a un progetto privato o interno all'azienda, sarebbe giusto controllarlo nel controllo della versione. D'altra parte, non controllerei mai il file json nel controllo della versione per i progetti open source, ovviamente.
arne.jans

1
@ arne.jans Sei in grado di impostare dinamicamente senderId o lo hai semplicemente codificato in values.xml? Devo recuperare senderId dinamicamente dal server e quindi registrarmi su FCM.
Bresiu

37

A cosa serve veramente questo file:

google-services.json contiene le credenziali dello sviluppatore e le impostazioni di configurazione, necessarie per la verifica durante la connessione con GoogleApiClient. Sebbene il tuo servizio funzioni correttamente con il tuo dispositivo di prova poiché rileva il tuo account sviluppatore, ma dopo aver rilasciato l'app in pubblico, non funzionerà senza il file json. Quindi non cancellarlo.

La documentazione ufficiale dice:

L'applicazione crea un GoogleApiClient, specificando a quali ambiti e API l'applicazione accederà. Quando GoogleApiClient si connette, l'utente ha effettuato l'accesso.

Guarda la sezione come funziona .


3
La ringrazio per la risposta. Ha solo domande anche se mi chiedo se sei disposto ad aiutare. Ho visto che il tuo link è pubblicato per i servizi di accesso. Ma se utilizzo solo Google Analytics e il servizio GCM nella mia app, non è necessario accedere, devo comunque conservare questo file? Grazie!
Arthur Wang

3
Sì, per Analytics o GCM è necessario anche questo file di configurazione. Nel passaggio 2 della documentazione, dovevi andare al collegamento OTTIENI UN FILE DI CONFIGURAZIONE . Qui devi selezionare se stai utilizzando questo file di configurazione per GCM o analisi. Questo file contiene solo l'identità dello sviluppatore (come la chiave API, l'hash SHA1 del PC di sviluppo ecc.)
Mohammad Arman

2
@androidGuy Ci scusiamo per il ritardo nella risposta. Penso che tu debba creare il nuovo file di configurazione google-services.json con l'ultima versione di keyhash SHA1. Altrimenti alcune funzionalità potrebbero non funzionare dopo la pubblicazione su Play Store. Scusa per la confusione precedente, cancellerò il mio commento precedente in quanto lascerà che qualcuno vada nella direzione sbagliata.
Mohammad Arman

1
Se si copiano le parole di un'altra persona, è necessario li blockquote correttamente e fornire l'attribuzione completa. Ho annullato la tua modifica, poiché la considero plagio della risposta sotto questa.
Brad Larson

6
E la sicurezza? È possibile ricreare e leggere google-services.json dall'apk? Vedo uno sviluppatore e una chiave API all'interno. Non mi piace che venga conosciuto da altri ...
Tino

4

Aggiungi google-services.json al tuo modulo ed esegui una PULIZIA e una RICOSTRUZIONE. Verrà generato un file xml in app / build / generated / res / google-services / debug / values ​​/ values.xml con le proprietà del progetto e potrai accedervi facilmente come una normale stringa xml. Esempio:

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

c'è un elenco con tutte le stringhe e maggiori informazioni nel documento google-service.json

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.