google-services.json для разных продуктовFlavors


453

Обновление: GCM устарела, используйте FCM

Я внедряю новый Google Cloud Messaging, следуя инструкциям на странице разработчиков Google здесь

Я успешно запустил и протестировал его. Но моя проблема сейчас в том, что у меня разные варианты продуктов с разными applicationId / packageName и разными идентификаторами проекта Google Cloud Messaging Project. google-services.jsonДолжно быть помещено в /app/google-services.jsonне папке вкусов.

Есть ли способ сделать google-services.jsonконфиг другим для разных вкусов?


Для Maven мы реализовали нечто подобное, используя профили maven и отдельные файлы свойств для каждого профиля
sakis kaliakoudas

1
если вы просто хотите использовать sender_id, то сгенерируйте ключ без имени пакета в консоли Google.
Муртаза Хуршид Хуссейн

Строка apply plugin: 'com.google.gms.google-services'в файле Gradle, кажется, помещает gcmстроки в app/build/generated/res/google-services/debug/values/values.xml...
Александр Фарбер

Лучший ответ, который я нашел для этого на этот вопрос
Эстель

Обязательно прочитайте это: firebase.googleblog.com/2016/08/… Это покрывает все возможности и компромиссы.
Альберт Вила Кальво

Ответы:


509

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 в этих местах (учитывая, что у вас есть flavorflavor1 и тип сборки debug):

/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#issuecomment-165824720

Ссылка на официальные документы: 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


13
По какой-то причине это не работает для меня - я получаю ошибку сборки gradle - File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.поэтому я собираюсь прибегнуть к копированию файла flavour в корневую папку каждый раз через скрипт сборки.
dodgy_coder

2
Работал как шарм, слава богу за это. google-services.json и весь этот новый способ использования их API кажется шагом назад. Не знаю, как это должно быть проще.
RED_

141
googl-services.json - это мерзость ... как проще управлять каким-нибудь сумасшедшим файлом json, чем просто вставить ключ API и идентификатор отправителя? Пожалуйста, Google прекратить глупость
Грег Эннис

19
В новейшей версии генератора конфигурационных файлов несколько свойств помещаются в один и тот же файл конфигурации, при этом снова требуется только одно свойство на уровне приложения, а не отдельные свойства на уровне вкуса. Вам просто нужно убедиться, что обе конфигурации генерируются под одним и тем же полем «Имя приложения».
sroskelley

5
Начиная с Android Studio 3.1.4, использование /app/src/flavor1/google-services.json больше не работает. Файлы должны быть расположены в /app/src/flavor1/debug/google-services.json и /app/src/flavor1/release/google-services.json.
Нуридер

71

ОБНОВЛЕНИЕ: Следующее объяснение относится к одному проекту 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.stackoverflow.example (live - release)
  • com.stackoverflow.example.dev (live - dev)
  • com.stackoverflow.example.debug (отладка - выпуск)
  • com.stackoverflow.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 проще, потому что они предоставляют один единственный файл со всем, что вам нужно для всех ваших конфигов.


Я создаю свой файл с developers.google.com/mobile/add, и есть только одна возможность добавить одно имя пакета. Где находится база Firebase для ее настройки или как выглядит файл google-services.json с несколькими вариантами
CQM

@CQM Я обновил ответ, добавив несколько ссылок. Вы можете просмотреть документацию по Firebase и сгенерировать файл JSON в консоли Firebase, как описано в ответе.
Сотти

7
Это действительно хороший ответ, и он должен быть единственным правильным ответом на этот вопрос.
Нандо

1
Я обнаружил это сам, когда столкнулся с той же самой проблемой, как вы описали это выше. Я пришел сюда, чтобы отправить ответ для потомков, и обнаружил, что вы уже сделали это. С версией 3.0.0 это, безусловно, лучший ответ.
Таш Пемхива

6
Обратите внимание, что это работает, только если все ваши варианты находятся в одном проекте Firebase. Если вы используете несколько проектов (я склонен держать dev и stage в одном проекте firebase и prod в отдельном выделенном prodet projet в другом аккаунте Google), вам нужно решение, изложенное Яиром Кукелькой. На самом деле плагин поддерживает различные пути - во время сборки вы получите подсказку о том, куда плагин искал файл google-services.json: «Не удалось найти google-services.json при поиске в [src / prod». / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

Написал Средний пост по этому вопросу.

Возникла похожая проблема (с использованием 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задача, чтобы изменить его на уровне вкуса.


Но это работает для buildTypes, а не для вкусов, как опубликовано в OP
bryant1410

1
@ bryant1410, если вы используете ароматизатор - я предполагаю, что вы можете вместо этого подключиться к задаче processDebugFlavorGoogleServices.
ZakTaccardi

Я думаю, что вы должны изменить это в своем ответе, так как вопрос был о вкусах, а не buildTypes. Я думаю, вы также можете оставить этот ответ в качестве второго варианта
bryant1410

1
@ bryant1410 логика в основном одинакова как для flavor, так и для buildType. Вы должны быть в состоянии понять это
ZakTaccardi

1
@IgorGanapolsky да, две версии
ZakTaccardi

13

Ну, я сталкиваюсь с той же проблемой и не могу найти идеального решения. Это просто обходной путь. Мне интересно, как Google не думал о вкусах ...? И я надеюсь, что они скоро предложат лучшее решение.

Что я делаю:

У меня есть два варианта, в каждый из которых я помещаю соответствующий google-services.json: src/flavor1/google-services.jsonи src/flavor2/google-services.json.

Затем в build 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 close ... не мог найти лучшего решения до сих пор.

Обновление, Другое решение: один google-services.json для всех вкусов:

Вы также можете иметь разные имена пакетов для каждого варианта, а затем в консоли разработчика Google вам не нужно создавать два разных приложения для каждого варианта, а только два разных клиента в одном приложении. Тогда у вас будет только один, google-services.jsonкоторый содержит оба ваших клиента. Конечно, это зависит от того, как вы реализуете бэкэнд своих вкусов. Если они не разделены, то это решение вам не поможет.


Вы имеете в виду, что если бэкэнды разделены, то это не сработает для вас, я полагаю
ZakTaccardi

все зависит от того, как вы определите ароматы с обеих сторон; клиент и сервер. В моем случае разные имена пакетов, разные адреса серверов и разные базы данных. Таким образом, сервер отправит уведомление пользователю в соответствующей базе данных. Пользователь A имеет токен 1 для flavor1 и токен2 для flav2. Если у вас есть разные записи в базе данных, то у вас не будет никаких проблем.
ahmed_khan_89

Я попытался создать задачи, которые будут копировать, а затем вызывать их для определенного процесса отладки или выпуска и думать, что это работает. Желаем, чтобы это было опубликовано ранее
humblerookie

1
Использование одного google-services.jsonдля обоих releaseи debugработал для меня, как упоминалось в вашем обновлении. Я думаю, что это самое простое решение, если вы пытаетесь разделить debugсборку, как я. Для справки вы можете создать файл здесь: developers.google.com/mobile/add?platform=android
yuval

12

Согласно ответу 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 '.'
        }
    }
}

Тогда вам не нужно переключать настройки вручную.


2
@ZakTaccardi, но вопрос касается вкусов, а не типов сборки
bryant1410

1
это не так хорошо , раствора , как medium.com/@ZakTaccardi/...
ZakTaccardi

2
Не работает Это запускает обе команды копирования независимо от стиля сборки, поэтому производственный json всегда находится в каталоге приложения.
Исаак

Это работает для ароматов. Нет необходимости вручную переключать переменные в build.gradle.
Вито Валов

9

Я использую файл google-services.json, созданный здесь: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient & cntlbl = Продолжить% 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-данные. Я не мог правильно его отформатировать ...


8

Файл 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);

6

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

Следуйте этому: https://stackoverflow.com/a/31598587/2382964

2.) Как файл google-services.json влияет на ваш проект студии android?

Следуйте этому: https://stackoverflow.com/a/33083898/2382964

просто в качестве второго URL, если вы добавляете google-services.json в свой проект, google-servicesдля этого debugварианта должна быть автоматически сгенерированная папка для варианта

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

3.) Что делать, чтобы это было сделано?

добавить зависимость google-services в project_levelbuild.gradle, вы также можете использовать ее, version 3.0.0если вы используете библиотеку app_compact.

// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'

теперь в app_levelbuild.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.


4

Нет необходимости в каких-либо дополнительных скриптах Gradle.

Google начал добавлять другое имя пакета в имя «android_client_info». Это выглядит ниже в google-services.json

"android_client_info": {
      "package_name": "com.android.app.companion.dev"
    }

поэтому для выбора другого google-services.json достаточно следующих шагов.

  1. Есть 2 вкуса
  2. Добавьте новый пакет dev flavour на страницу конфигурации Google Analystics и загрузите google-services.json.
  3. Обратите внимание, в новом файле конфигурации оба идентификатора пакета вашего вкуса есть
  4. Подготовьте любой свой вкус сборки.

Вот и все! ..


1
Я не уверен, что 2) и 3) относятся именно. Я не могу найти нигде в analytics.google.com, где я могу добавить названия пакетов, кроме ссылки на игровой магазин. Единственное место, которое я нашел для загрузки json - это здесь developers.google.com/mobile/add, и это не позволяет добавлять несколько названий пакетов. Будет ли это работать, просто добавляя имена пакетов в android_client_info?
Арберг

1
@arberg Вы можете добавить несколько имен пакетов в один и тот же проект, а затем загрузить файл. Проверьте здесь: github.com/googlesamples/google-services/issues/54
Кристер Нордвик,

4

У нас есть другое имя пакета для отладочных сборок (* .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.


4

Firebase теперь поддерживает несколько идентификаторов приложений с одним файлом google-services.json.

Этот блог описывает это подробно.

Вы создадите один родительский проект в Firebase, который будете использовать для всех ваших вариантов. Затем вы создаете отдельные приложения Android в Firebase под этим проектом для каждого имеющегося у вас идентификатора приложения.

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


4

Согласно документации Firebase вы также можете использовать строковые ресурсы вместо google-services.json .

Поскольку этот поставщик просто читает ресурсы с известными именами, другой вариант заключается в добавлении строковых ресурсов непосредственно в ваше приложение вместо использования подключаемого модуля Google Services. Вы можете сделать это:

  • Удаление google-servicesплагина из вашего корня build.gradle
  • Удаление google-services.jsonиз вашего проекта
  • Добавление строковых ресурсов напрямую
  • Удаление плагина применения: '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>

2
У меня возникли проблемы при сопоставлении значения ключа в файле google-services.json с соответствующим строковым эквивалентом, но потом я нашел это, которое помогло: developers.google.com/android/guides/… Опубликовано на случай, если у кого-то еще возникла такая же проблема.
Сайфур Рахман Мохсин

3

Основываясь на ответе @ 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. Замените названия вкусов на те, которые вы используете.


3

Я обнаружил, что плагин 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


@swimmingtomars Возможно, вы без необходимости применяете плагин google-service. Если вы используете этот метод, вы не сможете применить плагин google-services. Смотрите принятый ответ, если вам нужен этот плагин для обслуживания, отличного от GCM.
Кьонес

3

ОБНОВЛЕНО:

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


2

Смысл плагина google-services заключается в упрощении интеграции функций Google.

Поскольку он генерирует android-resources только из файла google-services.json, я думаю, что слишком сложная логика gradle сводит на нет этот момент.

Поэтому, если в Google-документации не указано, какие ресурсы необходимы для определенных функций Google, я бы предложил сгенерировать JSON-файл для каждого соответствующего типа сборки / разновидности, посмотреть, какие ресурсы генерируются плагином, а затем поместить эти ресурсы вручную. в соответствующие каталоги src / buildtypeORflavor / res.

После этого удалите ссылки на плагин google-services и JSON-файл, и все готово.

Для получения подробной информации о внутренней работе google-services gradle-plugin см. Мой другой ответ:

https://stackoverflow.com/a/33083898/433421


Я не понимаю, как, используя ваш ответ, я могу включить 2 google-service.json. 1 для отладки и другой для выпуска
penduDev

2

Упрощение того, что сказал Скотти. Вам нужно создавать приложения 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"
        }
      ]

    }

2

Действительно, один каталог 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


2

Так что если вы хотите программно скопировать 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файл в каждой папке вариантов, вот пример.вариант изображения


1

У вас много вкуса, так что это значит, что у вас будет много разных идентификаторов, верно? Итак, просто перейдите на страницу, где вы настраиваете / генерируете свой json-файл и конфигурируете для каждого имени пакета. Все это добавит в файл JSON.

Я очень ленив, чтобы опубликовать картинку сейчас, но в основном:

  • перейдите на страницу https://developers.google.com/mobile/add.
  • выберите платформу
  • выберите ваше приложение
  • ВАЖНЫЙ : введите название вашего пакета ароматизаторов в поле "имя пакета Android"
  • ... продолжить получать ваш файл конфигурации. Скачать это!

При настройке файла вы можете увидеть, что Google показывает вам ключ сервера API + идентификатор отправителя. И это одинаково для всей упаковки (вкусы)

В конце вам нужен только один файл json для всех вариантов.

Еще один вопрос, который вы должны проверить при регистрации, чтобы получить регистрационный токен, проверьте, есть ли разница для каждого варианта. Я не касаюсь этого, но это должно быть различие. Слишком поздно, и я так сонный :) Надеюсь, это поможет!


1

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


0

В настоящее время я использую два идентификатора проекта GCM в одном пакете приложения. Я поместил google-service.json моего первого проекта GCM, но я переключаюсь с первого на второй, только меняя SENDER_ID:

    String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

(На данный момент я думаю, что google-services.json не является обязательным)


0

Вдохновленный ответом @ 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
}

0

Поместите файл "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'
                    }
                }
            }
        }
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.