google-services.json для разных продуктов Flavors
Я внедряю новый Google Cloud Messaging, следуя инструкциям на странице разработчиков Google здесь
Я успешно запустил и проверил это. Но моя проблема сейчас в том, что у меня разные productFlavors с разными applicationId/packageName и разными GCM Project Id. google-services.json
должны быть помещены в /app/google-services.json
не папка ароматов.
Есть ли способ сделать google-services.json
Конфиг отличается для многих вкусов?
29 ответов
Google включил поддержку вкусов в версию 2.0 плагина сервисов воспроизведения. С этой версии gradle plugin com.google.gms:google-services:2.0.0-alpha3
вы можете сделать это
app/src/
flavor1/google-services.json
flavor2/google-services.json
Плагин версии 3.0.0 ищет файл json в этих местах (учитывая, что у вас есть flavor
flavour1 и тип сборки debug
):
/app/src/flavor1/google-services.json
/app/src/flavor1/debug/google-services.json
/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json
Это сработало для меня даже с использованием flavourDimensions. У меня есть бесплатные и платные в одном измерении и Mock & Prod в другом измерении. У меня также есть 3 buildTypes: отладка, выпуск и постановка. Вот как это выглядит в моем проекте для аромата FreeProd:
Сколько файлов google-services.json будет зависеть от характеристик вашего проекта, но вам потребуется как минимум один файл json для каждого проекта Google.
Если вы хотите узнать больше о том, что этот плагин делает с этими файлами json, вот оно: https://github.com/googlesamples/google-services/issues/54
Ссылка на официальные документы: https://developers.google.com/android/guides/google-services-plugin
Сообщение в блоге с обновленной информацией: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
И перейдите сюда, чтобы проверить последнюю версию этого плагина: https://bintray.com/android/android-tools/com.google.gms.google-services/view
ОБНОВЛЕНИЕ: Следующее объяснение относится к одному проекту Android Studio с одним проектом Firebase и различными приложениями Firebase внутри этого проекта. Если целью является создание разных файлов JSON для разных приложений Firebase в разных проектах Firebase внутри одного проекта Android Studio (или, если вы не знаете, в чем разница), посмотрите здесь.,
Вам нужно одно приложение Firebase для каждого идентификатора приложения Android (обычно это имя пакета). Обычно для каждого варианта сборки Gradle используется один идентификатор приложения (вероятно, если вы используете типы сборки Gradle и варианты сборки Gradle)
Начиная с Google Services 3.0 и с использованием Firebase, нет необходимости создавать разные файлы для разных вкусов. Создание разных файлов для разных вкусов может быть непонятным или простым, если у вас есть типы productFlavours и Build, которые сочетаются друг с другом.
В этом же файле вы будете иметь все необходимые конфигурации для всех типов сборки и разновидностей.
В консоли Firebase вам нужно добавить одно приложение для каждого имени пакета. Представьте, что у вас есть 2 варианта (dev и live) и 2 типа сборки (debug и release). В зависимости от вашей конфигурации, но вполне вероятно, что у вас есть 4 разных имени пакета, как:
- com.stackru.example (live - release)
- com.stackru.example.dev (live - dev)
- com.stackru.example.debug (отладка - выпуск)
- com.stackru.example.dev.debug (debug - dev)
Вам нужно 4 разных приложения для Android в консоли Firebase. (На каждом из них вам нужно добавить SHA-1 для отладки и в реальном времени для каждого компьютера, который вы используете)
Когда вы загружаете файл google-services.json, на самом деле не имеет значения, из какого приложения вы его загружаете, все они содержат одинаковую информацию, относящуюся ко всем вашим приложениям.
Теперь вам нужно найти этот файл на уровне приложения (app/).
Если вы откроете этот файл, вы увидите, что if содержит всю информацию для всех имен ваших пакетов.
Болевая точка использовать, чтобы быть плагином. Для того, чтобы он заработал, вам нужно найти плагин внизу вашего файла. Так что эта линия..
apply plugin: 'com.google.gms.google-services'
... должен быть в нижней части файла вашего приложения build.gradle.
Для большей части сказанного здесь это относится и к предыдущим версиям. У меня никогда не было разных файлов для разных конфигов, но теперь с консолью Firebase проще, потому что они предоставляют один единственный файл со всем, что вам нужно для всех ваших конфигов.
Написал Средний пост по этому вопросу.
Возникла похожая проблема (с использованием BuildTypes вместо Flavors), и она была исправлена следующим образом.
Воспользуйтесь преимуществами системы управления зависимостями Gradle. Я создал две задачи, switchToDebug
а также switchToRelease
, Требовать, чтобы в любое время assembleRelease
это бег, что switchToRelease
также запускается. То же самое для отладки.
def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'
task switchToDebug(type: Copy) {
def buildType = 'debug'
description = 'Switches to DEBUG google-services.json'
from "${srcDir}/${buildType}"
include "$googleServicesJson"
into "$appModuleRootFolder"
}
task switchToRelease(type: Copy) {
def buildType = 'release'
description = 'Switches to RELEASE google-services.json'
from "${srcDir}/${buildType}/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}
afterEvaluate {
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
}
РЕДАКТИРОВАТЬ: использовать processDebugFlavorGoogleServices
/processReleaseFlavorGoogleServices
задача изменить его на уровне вкуса.
Согласно ahmed_khan_89, вы можете поместить свой "код копии" во вкус продукта.
productFlavors {
staging {
applicationId = "com.demo.staging"
println "Using Staging google-service.json"
copy {
from 'src/staging/'
include '*.json'
into '.'
}
}
production {
applicationId = "com.demo.production"
println "Using Production google-service.json"
copy {
from 'src/production/'
include '*.json'
into '.'
}
}
}
Тогда вам не нужно переключать настройки вручную.
Ну, я сталкиваюсь с той же проблемой и не могу найти идеального решения. Это просто обходной путь. Мне интересно, как Google не думал о вкусах...? И я надеюсь, что они скоро предложат лучшее решение.
Что я делаю:
У меня есть два варианта, в каждый из которых я помещаю соответствующий google-services.json: src/flavor1/google-services.json
а также src/flavor2/google-services.json
,
Затем в сборке Gradle я копирую файл в зависимости от вкуса в app/
каталог:
android {
// set build flavor here to get the right gcm configuration.
//def myFlavor = "flavor1"
def myFlavor = "flavor2"
if (myFlavor.equals("flavor1")) {
println "--> flavor1 copy!"
copy {
from 'src/flavor1/'
include '*.json'
into '.'
}
} else {
println "--> flavor2 copy!"
copy {
from 'src/flavor2/'
include '*.json'
into '.'
}
}
// other stuff
}
Ограничение: вам придется изменить myFlavor
вручную в gradle каждый раз, когда вы хотите использовать другой аромат (потому что он жестко запрограммирован).
Я пробовал много способов, чтобы получить текущий вкус сборки, как afterEvaluate
близко... не мог найти лучшего решения до сих пор.
Обновление, Другое решение: один google-services.json для всех вкусов:
Вы также можете иметь разные имена пакетов для каждого варианта, а затем в консоли разработчика Google вам не нужно создавать два разных приложения для каждого варианта, а только два разных клиента в одном приложении. Тогда у тебя будет только один google-services.json
который содержит ваши оба клиента. Конечно, это зависит от того, как вы реализуете бэкэнд своих вкусов. Если они не разделены, то это решение вам не поможет.
1.) Что на самом деле делает google-services.json?
Следуйте этому: /questions/30184890/chto-na-samom-dele-delaet-google-servicesjson/30184900#30184900
2.) Как файл google-services.json влияет на ваш проект Android Studio?
Следуйте этому: /questions/30184890/chto-na-samom-dele-delaet-google-servicesjson/30184899#30184899
просто для второго URL, если вы добавляете google-services.json в свой проект, должен быть автоматически сгенерированный google-services
папка для debug
вариант на этом пути
app/build/generated/res/google-services/debug/values/values.xml
3.) Что делать, чтобы это было сделано?
добавить зависимость Google-сервисов в project_level
build.gradle, вы также можете использовать version 3.0.0
если вы используете библиотеку app_compact.
// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'
Сейчас в app_level
build.gradle вы должны добавить внизу.
// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'
4.) Где разместить файл google-service.json в вашей структуре.
случай 1.) если у вас нет build_flavor, просто поместите его внутрь /app/google-service.json
папка.
случай 2.) если у вас несколько build_flavor и у вас есть разные-разные файлы google_services.json app/src/build_flavor/google-service.json
,
вариант 3.) если у вас несколько build_flavor и у вас есть один файл google_services.json app/google-service.json
,
Я использую файл google-services.json, созданный здесь: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging%2Fandroid%2Fclient&cntlbl=Continue%20Adding%20GCM%20Support&%3Fconfigured%3Dtrue
В JSON-структуре есть JSON-массив, называемый клиентами. Если у вас есть несколько вкусов, просто добавьте различные свойства здесь.
{
"project_info": {
"project_id": "PRODJECT-ID",
"project_number": "PROJECT-NUMBER",
"name": "APPLICATION-NAME"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR1",
"client_id": "android:PACKAGE-NAME-1",
"client_type": 1,
"android_client_info": {
"package_name": "PACKAGE-NAME-1"
}
},
"oauth_client": [],
"api_key": [],
"services": {
"analytics_service": {
"status": 1
},
"cloud_messaging_service": {
"status": 2,
"apns_config": []
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"google_signin_service": {
"status": 1
},
"ads_service": {
"status": 1
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR2",
"client_id": "android:PACKAGE-NAME-2",
"client_type": 1,
"android_client_info": {
"package_name": "PACKAGE-NAME-2"
}
},
"oauth_client": [],
"api_key": [],
"services": {
"analytics_service": {
"status": 1
},
"cloud_messaging_service": {
"status": 2,
"apns_config": []
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"google_signin_service": {
"status": 1
},
"ads_service": {
"status": 1
}
}
}
],
"client_info": [],
"ARTIFACT_VERSION": "1"
}
В моем проекте я использую тот же идентификатор проекта, и когда я добавляю второе имя пакета в указанном выше URL-адресе, google предоставляет мне файл, содержащий несколько клиентов в json-data.
Извините за компактные JSON-данные. Я не мог правильно отформатировать его...
Файл google-services.json не нужен для получения уведомлений. Просто добавьте переменную для каждого варианта в ваш файл build.gradle:
buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""
Используйте эту переменную BuildConfig.GCM_SENDER_ID вместо getString(R.string.gcm_defaultSenderId) при регистрации:
instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
- удалить существующие
google-services.json
из вашего проекта. - Сборка> Чистый проект
- скомпилируйте и запустите ваше приложение
- посмотрите на появляющееся сообщение об ошибке, чтобы понять, где вы можете разместить
google-services.json
..mine выглядел такFile google-services.json is missing. The Google Services Plugin cannot function without it. Searched Location: C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_Debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\devDebug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\devSuffixYes_EnvQaApistaging_\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\debug\devSuffixYes_EnvQaApistaging_\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffixDebug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_Debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\envDebug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qaDebug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_Debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\src\dev\suffix\yes_\env\qa\apistaging_\debug\google-services.json C:\Users\username\Desktop\HelloWorld\app\google-services.json
Я знаю, ты сомневаешься в
google-services.json
файл
should be put in the root
app
папка, да? Я разрушу миф - не обязательно. Вы можете поместить файл google-services.json в
flavor folder
тоже. Как это:
Firebase теперь поддерживает несколько идентификаторов приложений с одним файлом google-services.json.
Этот блог описывает это подробно.
Вы создадите один родительский проект в Firebase, который будете использовать для всех ваших вариантов. Затем вы создаете отдельные приложения Android в Firebase под этим проектом для каждого имеющегося у вас идентификатора приложения.
Когда вы создали все свои варианты, вы можете скачать google-services.json, который поддерживает все идентификаторы ваших приложений. Когда уместно видеть данные отдельно (например, отчеты о сбоях), вы можете переключать их с помощью раскрывающегося списка.
Согласно документам Firebase вы также можете использовать строковые ресурсы вместо google-services.json.
Поскольку этот провайдер просто читает ресурсы с известными именами, другой вариант - добавить строковые ресурсы непосредственно в ваше приложение вместо использования плагина Gradle служб Google. Вы можете сделать это:
- Удаление
google-services
плагин из вашего корневого build.gradle- Удаление
google-services.json
из вашего проекта- Добавление строковых ресурсов напрямую
- Удаление плагина Apply:
'com.google.gms.google-services'
из вашего приложения build.gradle
пример strings.xml
:
<string name="google_client_id">XXXXXXXXX.apps.googleusercontent.com</string>
<string name="default_web_client_id">XXXX-XXXXXX.apps.googleusercontent.com</string>
<string name="gcm_defaultSenderId">XXXXXX</string>
<string name="google_api_key">AIzaXXXXXX</string>
<string name="google_app_id">1:XXXXXX:android:XXXXX</string>
<string name="google_crash_reporting_api_key">AIzaXXXXXXX</string>
<string name="project_id">XXXXXXX</string>
У нас есть другое имя пакета для отладочных сборок (*.debug), поэтому я хотел что-то, что работает на основе flavour и buildType, без необходимости писать что-то связанное со вкусом в шаблоне processDebugFlavorGoogleServices
,
Я создал папку с именем "google-services" в каждом варианте, содержащую как отладочную версию, так и версию выпуска файла json:
В разделе buildTypes вашего файла Gradle добавьте это:
applicationVariants.all { variant ->
def buildTypeName = variant.buildType.name
def flavorName = variant.productFlavors[0].name;
def googleServicesJson = 'google-services.json'
def originalPath = "src/$flavorName/google-services/$buildTypeName/$googleServicesJson"
def destPath = "."
copy {
if (flavorName.equals(getCurrentFlavor()) && buildTypeName.equals(getCurrentBuildType())) {
println originalPath
from originalPath
println destPath
into destPath
}
}
}
Когда вы переключите вариант сборки, он автоматически скопирует нужный файл json в корень вашего модуля приложения.
Добавьте два метода, вызываемых, чтобы получить текущий вариант и текущий тип сборки в корне вашего build.gradle
def getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if( tskReqStr.contains( "assemble" ) )
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher( tskReqStr )
if( matcher.find() ) {
println matcher.group(1).toLowerCase()
return matcher.group(1).toLowerCase()
}
else
{
println "NO MATCH FOUND"
return "";
}
}
def getCurrentBuildType() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
if (tskReqStr.contains("Release")) {
println "getCurrentBuildType release"
return "release"
}
else if (tskReqStr.contains("Debug")) {
println "getCurrentBuildType debug"
return "debug"
}
println "NO MATCH FOUND"
return "";
}
Вот и все, вам не нужно беспокоиться об удалении / добавлении / изменении вариантов из вашего файла Gradle, и он автоматически получает отладочный файл или релиз google-services.json.
Так что если вы хотите программно скопировать google-services.json
файл из всех ваших вариантов в вашу корневую папку. Когда вы переключаетесь на конкретный вариант, вот решение для вас
android {
applicationVariants.all { variant ->
copy {
println "Switches to $variant google-services.json"
from "src/$variant"
include "google-services.json"
into "."
}
}
}
У этого подхода есть предостережение: google-service.json
файл в каждой из ваших папок вариантов, вот пример.
ОБНОВЛЕНО:
С точки зрения настройки Firebase с вариантами сборки, пожалуйста, обратитесь к этому блогу, в котором есть подробные инструкции.
Нет необходимости в каких-либо дополнительных скриптах Gradle.
Google начал добавлять другое имя пакета в имя "android_client_info". Это выглядит ниже в google-services.json
"android_client_info": {
"package_name": "com.android.app.companion.dev"
}
поэтому для выбора другого google-services.json достаточно следующих шагов.
- Есть 2 вкуса
- Добавьте новый пакет dev flavour на страницу конфигурации Google Analystics и загрузите google-services.json.
- Обратите внимание, в новом файле конфигурации оба идентификатора пакета вашего вкуса есть
- Подготовьте любой свой вкус сборки.
Вот и все!..
Я обнаружил, что плагин google-services совершенно бесполезен для проектов, которые хотят добавить GCM. Он только генерирует следующий файл, который просто добавляет идентификатор вашего проекта в качестве строкового ресурса:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Your API key would be on the following line -->
<string name="gcm_defaultSenderId">111111111111</string>
</resources>
Похоже, он вам нужен только в том случае, если вы скопировали образец кода прямо из руководства Cloud Messaging for Android. Вот пример строки:
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Решение
Если вы хотите иметь возможность переключать проекты API для разных типов сборки или разновидностей продукта, вы можете просто определить свои собственные константы и выбрать соответствующую при вызове getToken()
API.
private static final String SENDER_ID = "111111111111";
private static final String SANDBOX_SENDER_ID = "222222222222";
String token = instanceID.getToken(
BuildConfig.DEBUG ? SENDER_ID : SANDBOX_SENDER_ID,
GoogleCloudMessaging.INSTANCE_ID_SCOPE,
null);
Для ароматов продуктов
Приведенный выше код работает для переключения между сборками отладки и выпуска. Для вариантов продукта вы должны определить различные ключи API в исходном файле Java и поместить файлы в соответствующий каталог продукта. Для справки: Варианты сборки Gradle
Просто добавьте идентификатор приложения ароматов и имя аромата как приложение в том же проекте. В конце загрузите файл google-service.json , и он будет иметь все ароматы в клиентском массиве [], который подойдет для всех ароматов.
Упрощение того, что сказал Скотти. Вам необходимо создавать приложения Multiples с разными именами пакетов для конкретного проекта в зависимости от вкуса продукта.
Предположим, что ваш проект представляет собой ABC с различными вариантами продукта X,Y, где X имеет имя пакета com.x, а Y имеет имя пакета com.y, тогда в консоли Firebase вам нужно создать проект ABC, в котором вам нужно создать 2 приложения. с именами пакетов com.x и com.y. Затем вам нужно скачать файл google-services.json, в котором будет 2 объекта client-info, которые будут содержать эти пакеты, и вам будет хорошо.
Фрагмент JSON будет что-то вроде этого
{
"client": [
{
"client_info": {
"android_client_info": {
"package_name": "com.x"
}
{
"client_info": {
"android_client_info": {
"package_name": "com.y"
}
]
}
Краткий ответ:
- Реализация: по умолчанию вы должны скопировать
google-services.json
в приложение dir.
Для другого аромата скопируйте
google-services.json
к / SRC /{аромат имя} приложения директории
- Тест: попробуйте выполнить сборку, откройте вкладку "Сборка", затем проверьте выводимое сообщение с помощью синтаксического анализа json-файла:.....
Основываясь на ответе @ZakTaccardi и предполагая, что вам не нужен один проект для обоих вариантов, добавьте это в конец вашего build.gradle
файл:
def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'
task switchToStaging(type: Copy) {
outputs.upToDateWhen { false }
def flavor = 'staging'
description = "Switches to $flavor $googleServicesJson"
delete "$appModuleRootFolder/$googleServicesJson"
from "${srcDir}/$flavor/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}
task switchToProduction(type: Copy) {
outputs.upToDateWhen { false }
def flavor = 'production'
description = "Switches to $flavor $googleServicesJson"
from "${srcDir}/$flavor/"
include "$googleServicesJson"
into "$appModuleRootFolder"
}
afterEvaluate {
processStagingDebugGoogleServices.dependsOn switchToStaging
processStagingReleaseGoogleServices.dependsOn switchToStaging
processProductionDebugGoogleServices.dependsOn switchToProduction
processProductionReleaseGoogleServices.dependsOn switchToProduction
}
Вам нужно иметь файлы src/staging/google-services.json
а также src/production/google-services.json
, Замените названия вкусов на те, которые вы используете.
Эй, друзья также ищет имя, использовать только строчные, то вы не получите эту ошибку
Действительно, оправдать один google-services.json в MyApp/app/
каталог хороший, нет необходимости в дополнительном скрипте с com.google.gms:google-services:3.0.0
, Но будьте осторожны, чтобы удалить файл google-services.json
из каталога приложения MyApp/app/src/flavor1/res/
чтобы избежать ошибки типа Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package
Смысл плагина google-services заключается в упрощении интеграции функций Google.
Поскольку он генерирует android-resources только из файла google-services.json, я думаю, что слишком сложная логика gradle сводит на нет этот момент.
Поэтому, если в Google-документации не указано, какие ресурсы необходимы для определенных функций Google, я бы предложил сгенерировать JSON-файл для каждого соответствующего типа сборки / разновидности, посмотреть, какие ресурсы генерируются плагином, а затем поместить эти ресурсы вручную. в соответствующие каталоги src/buildtypeORflavor/res.
После этого удалите ссылки на плагин google-services и JSON-файл, и все готово.
Для получения подробной информации о внутренней работе google-services gradle-plugin см. Мой другой ответ:
/questions/30184890/chto-na-samom-dele-delaet-google-servicesjson/30184899#30184899
У вас много вкуса, так что это означает, что вы будете иметь много идентификатора пакета различий, верно? Итак, просто перейдите на страницу, где вы настраиваете / генерируете свой json-файл и конфигурируете для каждого имени пакета. Все это добавит в файл JSON.
Я очень ленив, чтобы опубликовать картинку сейчас, но в основном:
- перейдите на https://developers.google.com/mobile/add.
- выберите платформу
- выберите ваше приложение
- ВАЖНО: введите название вашего пакета ароматизаторов в поле "имя пакета Android"
- ... продолжить получать ваш файл конфигурации. Загрузить!
При настройке файла вы можете увидеть, что Google показывает вам ключ API сервера + идентификатор отправителя. И это одинаково для всей упаковки (вкусы)
В конце вам нужен только один файл json для всех вариантов.
Еще один вопрос, который вы должны проверить при регистрации, чтобы получить регистрационный токен, проверьте, есть ли разница для каждого варианта. Я не касаюсь этого, но это должно быть различие. Слишком поздно, и я так сонный:) Надеюсь, это поможет!
Вдохновленный ответом @ahmed_khan_89 выше. Мы можем напрямую сохранить это в файле Gradle.
android{
// set build flavor here to get the right Google-services configuration(Google Analytics).
def currentFlavor = "free" //This should match with Build Variant selection. free/paidFull/paidBasic
println "--> $currentFlavor copy!"
copy {
from "src/$currentFlavor/"
include 'google-services.json'
into '.'
}
//other stuff
}
В настоящее время я использую два идентификатора проекта GCM в одном пакете приложения. Я поместил google-service.json моего первого проекта GCM, но я переключаюсь с первого на второй, только меняя SENDER_ID:
String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
(На данный момент я думаю, что google-services.json не является обязательным)
Поместите файл "google-services.json" в app/src/flavors соответственно, затем в build.gradle приложения, под android добавьте ниже код
gradle.taskGraph.beforeTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)process${variant.name}GoogleServices/) {
copy {
from "/src/${variant.flavorName}"
into '.'
include 'google-services.json'
}
}
}
}
}
...
gradle.taskGraph.beforeTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
copy {
from "src/tenants/${variant.flavorName}"
include 'google-services.json'
into '.'
}
}
}
}
}
gradle.taskGraph.afterTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)process${variant.flavorName}(Debug|Release)GoogleServices/) {
delete fileTree(".").matching {
include 'google-services.json'
}
}
}
}
}