Gradle:仅为特定的Flavor应用插件

30

我的Android gradle目前为了使用不同的推送服务设置了一种flavor维度。 (一个用于百度推送,一个用于GCM)我希望我的Android应用程序只导入google-services以进行GCM推送构建。是否可能做到这一点?

P.S. 因为要在Android中使用GCM,必须将apply plugin: 'com.google.gms.google-services'行添加到我的app/build.gradle文件底部,详见此处

作为解决方法,为了让百度flavor成功构建,我可能需要为百度放置一个虚拟的google-services.json

更新:我似乎在这个长的GitHub问题线程中找到了答案。


1
在你的更新中,包含一个解决问题的帖子链接。 - drhr
你能否只为特定的Build variant应用插件,例如: android.applicationVariants.all{ it.variantData.getVariantConfiguration().getFullName().capitalize(); //if here} - Leonard Arnold
3
可能是如何在Gradle中仅将插件应用于一个Flavor?的重复问题。 - Simon Featherstone
你有什么解决方案吗?我也遇到了同样的问题,链接 https://github.com/googlesamples/google-services/issues/54 似乎并没有帮助。我的应用有多个 flavor,和你的情况类似,其中一些是为中国而设计的,因此不需要 Firebase。我正在寻找不运行 apply plugin: 'com.google.gms.google-services' 的特定变体的方法。 - Noel Chew
3个回答

20

在你的 build.gradle(App)文件中添加以下代码:

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

注意:口味名称的第一个字母必须是大写字母。

更新于2021-11-23:请注意下面由Prasoon Abhishek提供的解决方案


6
我认为否定是一个错误吗?我的意思是,如果你想要使用GCM风味,那么你就需要应用GMS插件,不是吗? - Daniele Ricci
1
重要提示:第一个字母必须大写,如此规定在此处已经说明 https://dev59.com/410Z5IYBdhLWcg3wfge-#43336869 - Augusto Carmo
谢谢Augusto Carmo。我已经添加了这个。 - Anisuzzaman Babla
Prasoon的解决方案对我不起作用(与另一个插件一起)。对Gradle任务名称的检查按预期工作。 - Sébastien

5
我曾遇到同样的问题 - 我有一个项目,构建了多个应用程序,每个应用程序都有两个变体,一个通过Google Play分发并使用Google Play服务和Firebase API,另一个变体通过Web下载(主要供AOSP设备使用),不能包含任何Google Play服务或Firebase API。

在我们的app/build.gradle文件中,我们不想要任何看起来不太明显的奇怪条件测试,也就是说,“如果变体==web,则不应用插入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'
        }

发布维度有两个值 - “store”和“web”

Firebase控制台生成的google-services.json文件被放置在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'
}

最后,根据https://firebase.google.com/docs/android/setup中的指示,在build.gradle文件末尾全局应用了Google Play服务插件。

apply plugin: 'com.google.gms.google-services'

谢谢!似乎你无法阻止插件的应用,因此使用虚拟的google-services.json文件似乎是解决问题的方法。 - dreyln

2

只需在 build.gradle 文件中特定的构建类型定义中应用依赖关系。

android{
      productFlavors {

         flavourName{
         apply plugin: 'com.google.gms.google-services'
        }
       }
     }

1
这应该是被接受的答案。 - The IT gal
4
这个不起作用。使用这个解决方案,插件也会应用于其他版本。 - Alex Art.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接