Что на самом деле делает google-services.json?

120

Я работаю над добавлением сервисов Google Analytics и GCM в свое текущее приложение. В руководстве по реализации обеих служб Google просит разработчика создать файл json: google-services.json и поместить его в корневой каталог приложения.

Я обнаружил, что даже если я удалю этот файл json из своего приложения, службы все равно будут работать.

Просто хочу точно знать, для чего на самом деле этот файл? Как оно используется и как оно работает?

Артур Ван
источник

Ответы:

197

Я немного исследовал плагин google-services и json и нашел источники для этого плагина.

Перво-наперво

Gradle-plugin google-services, на который ссылается classpath и с помощью apply, является только плагином времени сборки! Таким образом, это влияет только на процесс сборки вашего приложения, но не на процесс выполнения!

Этот плагин предназначен только как помощник для быстрой интеграции служб Google в ваше приложение. Очевидно, что процесс несколько запутан и не задокументирован, поэтому Google должен был прояснить, что этот процесс делает.

Фактически, я нашел исходный код для версии плагина com.google.gms: google-services: 1.4.0-beta3 и не нашел в нем какой-либо конкретной ссылки относительно appinvites и не нашел никакого Google API для App Invites! (Но, возможно, он просто использует общий проект API с идентификатором проекта, я этого не пробовал)

Что оно делает

Плагин google-services gradle-plugin ищет упомянутый файл google-services.json в вашем модуле приложения. Затем он ищет настроенные параметры, такие как идентификаторы проекта, идентификаторы отслеживания и т. Д., Созданные консолью разработчика Google API в файле google-services.json. Из найденных настроек значения ресурсов Android генерируются по следующему пути:

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

Например, для отладки вашего приложения:

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

Например, если вы следовали руководству GCM, файл JSON будет включать идентификатор проекта API в качестве следующего ресурса android:

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

Таким образом, этот плагин и файл JSON не являются необходимыми для запуска или публикации вашего приложения, это просто помощник по быстрому запуску для создания некоторых базовых файлов ресурсов Android для упрощения интеграции определенных функций Google API.

Обратите внимание, что в исходном коде, упомянутом ниже, плагин google-services всегда генерирует эти ресурсы android для каждого варианта приложения, определенного в вашем app / build.gradle.

Если вы этого не хотите, вы должны использовать эти сгенерированные ресурсы в нужных вам вариантах приложения, а остальные удалить. Не забудьте удалить плагин google-services apply из app / build.gradle, иначе он будет восстановлен для всех вариантов приложения.

Что это не так

Этот плагин и JSON-файл НЕ влияют напрямую на внутреннюю работу указанных функций Google для вашего приложения! Если вы уже следовали более старым руководствам на сайте developer.android.com по интеграции, например, GCM или Google Analytics, вам даже не нужно интегрировать ни google-services gradle-plugin, ни файл google-services.json!

Уведомление о том, где я нашел источники

После того, как вы интегрировали gradle-plugin google-services и при синхронизации вашего проекта, Gradle автоматически загружает зависимость google-services по пути, подобному этому (в Windows вам может потребоваться заглянуть в свой дом / .gradle для 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

Если вы извлечете этот jar-файл, вы найдете два файла:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

которые содержат простой исходный код плагина gradle.

GoogleServicesPlugin.groovy

содержит обработку вариантов приложения, основные определения путей и т. д.

GoogleServicesTask.java

содержит фактическое определение задачи, найдите следующий метод, чтобы увидеть, что он на самом деле делает:

@TaskAction
public void action() throws IOException { 
arne.jans
источник
2
гораздо лучший ответ. однако, похоже, возникают проблемы при попытке следовать рекомендованному подходу ( developers.google.com/analytics/devguides/collection/android/v4 ) "принятый ответ" - это нелепая концепция SO, которая полностью зависит от терпения человека, который может решить ...
axd
7
Дополнительная заметка по этому поводу, поскольку она могла измениться с тех пор, как вы разместили это. В руководстве по плагину Google Services Gradle говорится о второй функции плагина. Он также утверждает, что добавляет некоторые зависимости для «базовых библиотек, необходимых для включенных вами сервисов», а также проверяет конфликты зависимостей (от смешивания версий). Я покопался в источниках, и, похоже, он также вводит "compile com.google.android.gms: play-services-measurement". Просто к сведению, если кто-то увидит это всплывающее окно и не уверен, почему.
Android3000 05
3
Учитывая, что файл содержит пару ключей, безопасно ли добавлять его в систему контроля версий? Насколько я могу судить, это только отпечатки пальцев, так что я считаю, что это безопасно. Но я не совсем уверен.
exhuma
1
@exhuma по моему личному мнению, если вы работаете над частным или внутренним проектом компании, было бы нормально проверить его в системе контроля версий. С другой стороны, очевидно, что я бы никогда не стал проверять json-файл в системе контроля версий для проектов с открытым исходным кодом.
arne.jans 06
1
@ arne.jans Можете ли вы установить senderId динамически, или вы просто жестко запрограммировали его в values.xml? Мне нужно динамически получать senderId с сервера, а затем регистрироваться в FCM.
Bresiu
37

Для чего на самом деле этот файл:

google-services.json содержит учетные данные разработчика и настройки конфигурации, которые необходимо проверить при подключении к GoogleApiClient. Хотя ваш сервис отлично работает с вашим тестовым устройством, поскольку он определяет вашу учетную запись разработчика, но после публичного выпуска вашего приложения оно не будет работать без файла json. Так что не удаляйте его.

В официальной документации говорится:

Приложение создает GoogleApiClient, указывая, к каким областям и API будет обращаться приложение. Когда GoogleApiClient подключается, пользователь входит в систему.

Посмотрите, как это работает .

Мохаммад Арман
источник
3
Спасибо за ваш ответ. Просто есть вопросы, но интересно, готовы ли вы помочь. Я видел, что ваша ссылка - это сообщение о службах входа. Но если я использую только службу Google Analytics и GCM в своем приложении, мне не нужно входить в систему, мне все равно нужно хранить этот файл? Спасибо!
Arthur Wang
3
Да, для аналитики или GCM вам также понадобится этот файл конфигурации. На шаге 2 документации вам нужно было перейти по ссылке ПОЛУЧИТЬ ФАЙЛ КОНФИГУРАЦИИ . Здесь вы должны выбрать, используете ли вы этот файл conf для GCM или аналитики. Этот файл просто содержит вашу личность разработчика (например, ключ api, хэш SHA1 вашего компьютера разработки и т. Д.)
Мохаммад Арман
2
@androidGuy Извините за поздний ответ. Я думаю, вам нужно создать новый файл конфигурации google-services.json с последним выпуском SHA1 keyhash. В противном случае некоторые функции могут не работать после публикации в игровом магазине. Извините за предыдущую путаницу, я удалю свой предыдущий комментарий, так как он уведет кого-то в неверном направлении.
Мохаммад Арман,
1
Если вы копируете слова другого человека, вы должны правильно процитировать их и указать полную информацию. Я откатил вашу правку, так как считаю это плагиатом ответа ниже этого.
Брэд Ларсон
6
А что насчет безопасности? Можно ли воссоздать и прочитать google-services.json из apk? Я вижу внутри разработчика и ключ API. Я не хочу, чтобы об этом узнали другие ...
Тино
4

Добавьте google-services.json в свой модуль и выполните ЧИСТУ и ПЕРЕСТРОЙКУ. XML-файл будет сгенерирован в app / build / generated / res / google-services / debug / values ​​/ values.xml со свойствами вашего проекта, и вы сможете легко получить доступ к нему, как к обычной строке xml. Пример:

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

есть список со всеми строками и дополнительной информацией в google-service.json doc

Бето Калдас
источник