O que o google-services.json realmente faz?

120

Trabalho na adição de serviços do Google Analytics e GCM ao meu aplicativo atual. No guia para a implementação de ambos os serviços, o Google solicita ao desenvolvedor que gere um arquivo json: google-services.json e coloque-o no diretório raiz do aplicativo.

Descobri que, mesmo se eu excluir esse arquivo json do meu aplicativo, os serviços ainda funcionarão.

Só quero saber com certeza, para que serve realmente esse arquivo? Qual é o seu uso e como funciona?

Arthur Wang
fonte

Respostas:

197

Eu investiguei um pouco sobre o plugin do google-services e o json e encontrei as fontes desse plugin.

Primeiras coisas primeiro

O google-services gradle-plugin que é referenciado por classpath e with apply é apenas um plug-in em tempo de construção! Portanto, ele influencia apenas o processo de criação do seu aplicativo, mas não o processo de tempo de execução!

Este plug-in é apenas um auxiliar de início rápido para integrar rapidamente os serviços do Google ao seu aplicativo. Obviamente, o processo é um tanto complicado e não está documentado; portanto, o Google deveria ter deixado claro o que esse processo faz.

Na verdade, encontrei o código-fonte da versão do plug-in com.google.gms: google-services: 1.4.0-beta3 e não encontrei nenhuma referência específica a respeito de convites de aplicativos, nem encontrei nenhuma API do Google para convites de aplicativos! (Mas talvez ele apenas use um projeto de API genérico com seu ID de projeto, eu não tentei isso)

O que faz

O plugin gradle do google-services procura o arquivo google-services.json mencionado no seu módulo de aplicativo. Em seguida, ele procura configurações definidas, como identificações de projeto e identificações de rastreamento, geradas pelo console do desenvolvedor da API do Google no arquivo google-services.json. A partir das configurações encontradas, os valores dos recursos do Android são gerados no seguinte caminho:

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

Por exemplo, para uma compilação de depuração do seu aplicativo:

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

Por exemplo, se você seguiu o tutorial do GCM, o arquivo JSON incluiria o ID do projeto da API como o seguinte recurso Android:

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

Portanto, esse plug-in e o arquivo JSON não são essenciais para executar ou publicar seu aplicativo, é apenas um auxiliar de início rápido para gerar alguns arquivos básicos de recursos do Android para facilitar a integração de recursos específicos da API do Google.

Observe no código-fonte mencionado abaixo que o plug-in google-services sempre gera esses recursos do Android para cada variante de aplicativo definida em seu app / build.gradle.

Se você não quiser, use os recursos gerados nas variantes de aplicativos que deseja e exclua os outros. Não se esqueça de remover o plug-in google-services aplicável a partir de app / build.gradle; caso contrário, ele será regenerado para todas as variantes de aplicativo.

O que não

Este plug-in e o arquivo JSON NÃO influenciam diretamente o funcionamento interno dos referidos recursos do Google para seu aplicativo! Se você já seguiu os tutoriais mais antigos no developer.android.com sobre como integrar, por exemplo, GCM ou Google Analytics, não precisa nem integrar o google-services do plugin gradle ou o arquivo google-services.json!

Aviso sobre onde encontrei as fontes

Depois de integrar o gradle-plugin do google-services e ao sincronizar seu projeto, o Gradle baixa automaticamente a dependência do google-services para um caminho semelhante a este (no Windows, talvez seja necessário procurar em sua home / .gradle for 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 você extrair esse arquivo jar, encontrará dois arquivos:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

que contêm o código-fonte simples do gradle-plugin.

GoogleServicesPlugin.groovy

contém o manuseio das variantes de aplicativos e definições básicas de caminhos etc.

GoogleServicesTask.java

contém a definição de tarefa real, procure o seguinte método para ver o que ele realmente faz:

@TaskAction
public void action() throws IOException { 
arne.jans
fonte
2
resposta muito melhor. no entanto, parece haver problemas ao tentar seguir a abordagem recomendada ( developers.google.com/analytics/devguides/collection/android/v4 ) "resposta aceita" é um conceito de SO ridículo que depende totalmente da paciência da pessoa que pode Decidir sobre isso ...
axd 23/02
7
Uma nota de acompanhamento sobre isso, pois pode ter sido alterada desde que você postou isso. O guia do plug-in do Google Services Gradle indica uma segunda função do plug-in. Ele também afirma adicionar algumas dependências para "bibliotecas básicas necessárias para os serviços que você ativou", além de verificar se há colisões de dependências (da mistura de versões). Eu procurei nas fontes e ele também parece injetar "compilar com.google.android.gms: play-services-measure". Apenas um FYI, caso alguém veja isso aparecer e não tenha certeza do porquê.
precisa saber é o seguinte
3
Considerando que o arquivo contém algumas chaves, é seguro adicioná-lo ao controle de versão? Pelo que sei, são apenas impressões digitais, então acho que é seguro. Mas não tenho muita certeza.
Exhuma
1
@exhuma, na minha opinião pessoal, se você estiver trabalhando em um projeto privado ou interno da empresa, seria bom verificar isso no controle de versão. Por outro lado, eu nunca verificaria o arquivo json no controle de versão para projetos de código aberto, obviamente.
Arne.jans
1
@ arne.jans Você pode definir o senderId dinamicamente ou apenas o codificou em values.xml? Preciso buscar o senderId dinamicamente no servidor e depois me registrar no FCM.
Bresiu
37

O que é realmente esse arquivo:

google-services.json contém credenciais de desenvolvedor e definições de configuração, necessárias para verificar a conexão com o GoogleApiClient. Embora seu serviço esteja funcionando bem com seu dispositivo de teste, pois está detectando sua conta de desenvolvedor, mas depois de liberar seu aplicativo em público, ele não funcionará sem o arquivo json. Portanto, não o apague.

A documentação oficial diz:

O aplicativo cria um GoogleApiClient, especificando quais escopos e APIs o aplicativo acessará. Quando o GoogleApiClient se conecta, o usuário está conectado.

Veja a seção como funciona .

Mohammad Arman
fonte
3
Obrigado pela sua resposta. Só tem perguntas, mas pergunto se você está disposto a ajudar. Vi que seu link foi publicado nos serviços de Logon. Mas se eu só uso o serviço Google Analytics e GCM no meu aplicativo, não preciso fazer login, ainda preciso manter esse arquivo? Obrigado!
Arthur Wang
3
Sim, para análises ou GCM, você também precisa desse arquivo de configuração. Na etapa 2 da documentação, você tinha que ir para o link OBTER UM ARQUIVO DE CONFIGURAÇÃO . É necessário selecionar se você está usando esse arquivo conf para GCM ou analytics. Este arquivo contém apenas a sua identidade desenvolvedor (como chave de API, hash SHA1 do seu pc desenvolvimento etc.)
Mohammad Arman
2
@androidGuy Desculpe pela resposta tardia. Eu acho que você precisa criar o novo arquivo google-services.json de configuração com a última versão do keyhash SHA1. Por outro lado, alguns recursos podem não funcionar após a publicação na Play Store. Desculpe a confusão anterior, excluirei meu comentário anterior, pois ele deixará alguém na direção errada.
Mohammad Arman
1
Se você copiar as palavras de outra pessoa, deverá citá-las adequadamente e fornecer a atribuição completa. Reverti sua edição, pois considero plágio a resposta abaixo desta.
Brad Larson
6
E a segurança? O google-services.json pode ser recriado e lido no apk? Eu vejo um desenvolvedor e uma chave de API dentro. Eu não gosto de ser conhecido por outros ...
Tino
4

Adicione google-services.json ao seu módulo e faça uma LIMPEZA e UMA RECONSTRUÇÃO. Um arquivo xml será gerado em app / build / generate / res / google-services / debug / values ​​/ values.xml com as propriedades do seu projeto e você poderá acessar facilmente como uma string xml normal. Exemplo:

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

existe uma lista com todas as strings e mais informações no google-service.json doc

Beto Caldas
fonte