gradle: применять плагин только для определенного вкуса

Мой Android-градус в настоящее время устанавливает параметр вкуса для использования другой службы push. (Один для push-уведомлений baidu и один для GCM). Я хотел бы, чтобы мое приложение для Android импортировало только google-services для сборки push-уведомлений GCM. Возможно ли это сделать?

P.S. Поскольку для использования GCM в Android мне нужно добавить строку apply plugin: 'com.google.gms.google-services' внизу моего файла app/build.gradle, как указано здесь.

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

Обновление: кажется, я нашел ответ в этом длинная ветка с проблемами на github.


comment
В своем обновлении включите ссылку на сообщение, которое решает проблему.   -  person drhr    schedule 05.11.2016
comment
вы не можете просто применить плагин для конкретного варианта сборки с android.applicationVariants.all{ it.variantData.getVariantConfiguration().getFullName().capitalize(); //if here}   -  person Leonard Arnold    schedule 14.02.2017
comment
Возможный дубликат Как применить плагин только к одному варианту в градиент?   -  person Simon Featherstone    schedule 09.03.2017
comment
Каково ваше решение? Я столкнулся с той же проблемой и ссылкой github.com/googlesamples/google-services/issues. /54 не помогает. У меня есть несколько вариантов, похожих на вашу ситуацию, некоторые из них предназначены для Китая и, следовательно, не требуют Firebase. Я ищу способы не запускать подключаемый модуль: «com.google.gms.google-services» для определенных вариантов.   -  person Noel Chew    schedule 17.05.2017


Ответы (2)


В файле build.gradle(App) добавьте этот код:

if (getGradle().getStartParameter().getTaskRequests()
        .toString().contains("YourGCMFlavorName")){
    apply plugin: 'com.google.gms.google-services'
}

Примечание: первая буква названия аромата должна быть в верхнем регистре

person Anisuzzaman Babla    schedule 09.07.2018
comment
Я считаю, что отрицание является ошибкой (?) - Я имею в виду, что если вы ищете вариант GCM, вы применяете плагин GMS, не так ли? - person Daniele Ricci; 31.07.2018
comment
Важный. Первая буква ДОЛЖНА быть в верхнем регистре, как указано здесь stackoverflow.com/a/43336869/5564683 - person Augusto Carmo; 10.09.2020
comment
Спасибо Аугусто Кармо. Я добавил это. - person Anisuzzaman Babla; 13.09.2020

У меня была такая же проблема: у меня есть проект, который создает несколько приложений, каждое приложение имеет два варианта: один распространяется через Google Play и использует API-интерфейсы Google Play Services и Firebase, другой вариант распространяется через веб-загрузку (в основном для устройств AOSP) и не может включать сервисы Google Play или API Firebase.

В нашем файле app/build.gradle мы не хотели никаких причудливых тестов условий, которые не кажутся совершенно очевидными, под этим мы подразумевали «если вариант == веб, то не применять подключаемые сервисы Google Play». Мы также не хотели иметь несколько копий файла google-services.json, то есть по одной для каждого приложения, нам нужна была копия, содержащая все пакеты приложений, включенные для сервисов Google Play. Это связано с тем, что мы довольно регулярно добавляем и удаляем приложения и хотим управлять этими приложениями как одним проектом в консоли Firebase.

Решение состояло в том, чтобы создать измерение распределения, это измерение должно быть помещено первым в массиве flavorDimensions (подключаемый модуль com.google.gms.google-services ищет google-services.json только в первом измерении). ).

    flavorDimensions 'distribution', 'application'
    productFlavors {
        store {
            dimension 'distribution'
        }
        web {
            dimension 'distribution'
            applicationIdSuffix ".nogms"
        }
        app1 {
            dimension 'application'
            applicationId 'com.example.app1'
        }
        app2 {
            dimension 'application'
            applicationId 'com.example.app2'
        }

У параметра распространение было два значения: "магазин" и "Интернет".

Файл google-services.json, сгенерированный консолью Firebase, был помещен в каталог app/src/store.

В каталог app/src/web мы поместили фиктивный файл google-services.json со следующим содержимым:

{
  "project_info": {
    "project_number": "0",
    "project_id": "api-project-0"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:0:android:0",
        "android_client_info": {
          "package_name": "com.example.app1.nogms"
        }
      },
      "api_key": [
        {
          "current_key": "none"
        }
      ]
    },
    {
      "client_info": {
        "mobilesdk_app_id": "1:0:android:0",
        "android_client_info": {
          "package_name": "com.example.app2.nogms"
        }
      },
      "api_key": [
        {
          "current_key": "none"
        }
      ]
    }
  ]
}

Это делает плагин счастливым. (Наборы приложений, отличные от GMS, необходимо добавлять в массив «client»:[] по мере необходимости).

Библиотеки GMS и Firebase были условно включены только в разновидности магазина:

dependencies {
    storeImplementation 'com.google.firebase:firebase-core:16.0.8'
    storeImplementation 'com.google.firebase:firebase-iid:17.1.2'
    storeImplementation 'com.google.firebase:firebase-messaging:17.6.0'
}

И, наконец, подключаемый модуль Google Play Services был применен глобально в конце build.gradle, как указано в https://firebase.google.com/docs/android/setup

apply plugin: 'com.google.gms.google-services'
person BitByteDog    schedule 21.06.2019
comment
Благодарю вас! Похоже, что вы не можете запретить применение плагина, поэтому использование фиктивного google-services.json кажется подходящим способом. - person dreyln; 16.08.2019