google-services.json для різних продуктів


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 плагіна служб Play. Оскільки ця версія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аромат1 та тип збірки debug):

/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json

Це працювало для мене, навіть використовуючи смакові розміри. Я маю безкоштовну оплату в одному вимірі, а Mock & Prod в іншому. У мене також є 3 типи збірки: налагодження, випуск та постановка. Ось як це виглядає в моєму проекті на смак FreeProd:

введіть тут опис зображення

Скільки файлів google-services.json залежатиме від характеристик вашого проекту, але вам знадобиться принаймні один файл json для кожного проекту Google.

Якщо ви хочете отримати докладніші відомості про те, що цей плагін робить з цими файлами json, ось це: https://github.com/googlesamples/google-services/isissue/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.тому я збираюся вдаватися до копіювання файлу ароматів у кореневу папку кожного разу за допомогою сценарію складання.
dodgy_coder

2
Працював як шарм, слава богу за це. google-services.json і весь цей новий спосіб використання їх apis виглядає як крок назад. Не знаю, як це може бути простіше.
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 типи складання (налагодження та випуск). Залежно від конфігурації, але цілком імовірно, що у вас є 4 різні назви пакунків, наприклад:

  • com.stackoverflow.example (live - реліз)
  • com.stackoverflow.example.dev (live - dev)
  • com.stackoverflow.example.debug (налагодження - випуск)
  • com.stackoverflow.example.dev.debug (налагодження - dev)

Вам потрібні 4 різні програми для Android у консолі Firebase. (На кожному з них потрібно додати SHA-1 для налагодження та жити для кожного комп’ютера, який ви використовуєте)

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

Тепер вам потрібно знайти цей файл на рівні програми (app /).

введіть тут опис зображення

Якщо ви відкриєте цей файл, ви побачите, що якщо він містить всю інформацію для всіх назв вашого пакета.

Точкою болю користуватися плагіном. Для того, щоб він працював, вам потрібно знайти плагін у нижній частині файлу. Отже ця лінія ..

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. Якщо ви використовуєте кілька проектів (я схильний тримати розробку та розробляти проект в одній базі файлів і продавати в окремому спеціалізованому проекті в іншому обліковому записі google), вам потрібне рішення, викладене Яіром Кукієлкою. Насправді плагін, як видається, підтримує різні шляхи - під час збирання ви отримаєте підказку про те, куди плагін шукає файл google-services.json: "Не вдалося знайти google-services.json під час перегляду в [src / prod / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

Написав середній пост з цього питання.

Була аналогічна проблема (використовуючи BuildTypes замість ароматів), і виправляла її так.

Скористайтеся системою управління залежностями 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
}

EDIT: використання processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServicesзавдання, щоб змінити його на рівні аромату.


Але це працює для buildTypes, а не для ароматів, як розміщено в ОП
bryant1410

1
@ bryant1410, якщо ви використовуєте ароматизатор - я здогадуюсь, що ви можете замість цього підключити до завдання ProcessDebugFlavorGoogleServices.
ZakTaccardi

Я думаю, ви повинні змінити це у своїй відповіді, оскільки питання стосувалося ароматів, а не типів build. Я думаю, ви також можете залишити цю відповідь як другий варіант
bryant1410,

1
@ bryant1410 логіка в основному однакова як для аромату, так і для 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 вручну в градусах кожен раз, коли ви хочете запустити інший аромат (адже він жорсткий).

Я спробував багато способів отримати поточний аромат складання, як afterEvaluateблизький ... досі не міг отримати кращого рішення.

Оновлення, ще одне рішення: один google-services.json для всіх ароматів:

Ви також можете мати різні назви пакетів для кожного аромату, і тоді в консолі розробника google вам не потрібно створювати два різних додатки для кожного аромату, а лише два різних клієнта в одному додатку. Тоді у вас буде лише один, google-services.jsonякий містить обох клієнтів. Звичайно, це залежить від того, як ви реалізовуєте основу своїх смаків. Якщо вони не розлучені, то це рішення вам не допоможе.


ви маєте на увазі, що якщо виклики відокремлюєтесь, то, я вважаю, це не вийде, я вважаю
ZakTaccardi

все залежить від того, як визначають ваші аромати в обох сторонах; клієнт та сервер. У моєму випадку різні назви пакетів, різні URL-адреси сервера та різні бази даних. Так сервер відправить повідомлення користувачеві у відповідну базу даних. Користувач A має маркер 1 для смаку1 та маркер2 для аромату2. Якщо у вас різні записи в базу даних, у вас не виникне жодних проблем.
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 = Продовжити% 20Додавання% 20GCM% 20Support &% 3Fffigured% 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-даних.

Вибачте за компактні дані 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-служб у 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 analytics та завантажте google-services.json.
  3. Зауважте, що у новому файлі конфігурації обидва ідентифікатори пакету вашого програмного забезпечення Flavour є
  4. Приготуйте будь-яку форму смаку.

Це все! ..


1
Я не впевнений, що саме 2) та 3) стосуються. Я не можу ніде знайти на analytics.google.com, де я можу додати назви пакетів, окрім посилання на магазин ігор. Єдине місце, яке я знайшов, щоб завантажити json, - це звідси developers.google.com/mobile/add, і це не дозволяє додавати кілька імен пакунків. Це буде працювати лише вручну, додаючи назви пакетів до android_client_info?
arberg

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

4

У нас є інша назва пакету для налагодження збірок (* .debug), тому я хотів щось, що працює на основі аромату та 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 .

Оскільки цей провайдер просто читає ресурси з відомими іменами, ще одним варіантом є додавання рядкових ресурсів безпосередньо до вашої програми замість використання плагіна Gradle для служб Google. Ви можете зробити це:

  • Видалення google-servicesплагіна з вашого root.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 Cloud Messaging для 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-сервіс. Якщо ви використовуєте цей метод, ви не можете застосувати плагін google-services. Дивіться прийняту відповідь, якщо вам потрібен цей плагін для служби, відмінної від GCM.
kjones

3

ОНОВЛЕНО:

Що стосується налаштування Firebase з варіантами складання, будь ласка, зверніться до цього блогу, де є детальні інструкції.


2

Суть плагіну google-services полягає у спрощенні інтеграції функцій Google.

Оскільки він лише генерує андроїд-ресурси з файлу google-services.json, я думаю, що надмірно складна логіка gradle заперечує цей момент.

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

Після цього видаліть посилання на плагін google-services та JSON-файл, і ви закінчите.

Детальну інформацію про внутрішню роботу Google-сервісів gradle-plugin дивіться у моїй іншій відповіді:

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


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

2

Спрощення того, що сказав @Scotti. Вам потрібно створити кілька додатків з різною назвою пакета для конкретного проекту залежно від смаку продукту.

Припустимо, ваш проект - це ABC, що має різні смаки продуктів X, Y, де X має назву пакета com.x, а Y має назву пакета com.y, тоді в консолі firebase потрібно створити проект ABC, у якому потрібно створити 2 програми з назвами пакетів com.x та com.y. Тоді вам потрібно завантажити файл google-services.json, в якому будуть два об’єкти, що містять інформацію про клієнта, які містять ці пакунки, і вам буде добре піти.

Фрагмент json був би чимось таким

{
  "client": [
    {
      "client_info": {
        "android_client_info": {
          "package_name": "com.x"
        }

    {
      "client_info": {
        "android_client_info": {
          "package_name": "com.y"
        }
      ]

    }

2

Дійсно, juste one 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

Hey Friends також шукає використання імен лише малі регістри, тоді ви не отримаєте цю помилку


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" під додатком / src / tasteres відповідно, потім у build.gradle програми, під андроїд додати нижче коду

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.