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

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

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

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

Обновление: я, кажется, нахожу ответ в этой длинной теме GitHub.

Ответ 1

В вашем файле build.gradle добавьте этот код:

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

Ответ 2

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

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

Решением было создать измерение распространения, это измерение должно быть помещено первым в массиве flavourDimensions (плагин 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 и 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'