You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Android构建变体/风味动态应用Gradle插件(排除指定变体)

基于构建变体动态应用Gradle插件的实现方案

问题根源

你之前的实现失效,是因为Gradle**同步阶段(Sync)**并未绑定具体的构建任务,getTaskRequests()仅在执行构建任务时会返回有效内容,同步时只会返回空的默认请求,无法以此判断当前选中的构建变体。

推荐实现方式

以下两种方案可覆盖Android Studio同步(通过Build Variants面板选择变体)和命令行构建两种场景:

方案1:结合系统属性与任务名称判断(简洁版)

直接读取Android Studio同步时传递的变体属性,同时检查命令行任务名称,决定是否应用插件:

// 读取Android Studio同步时选中的变体
val currentVariant = System.getProperty("android.injected.build.variant")
// 检查命令行是否包含nogms相关任务
val hasNogmsTask = gradle.startParameter.taskNames.any { it.contains("nogms", ignoreCase = true) }

// 仅当变体不含nogms且无相关任务时,应用Google Services插件
if ((currentVariant == null || !currentVariant.contains("nogms")) && !hasNogmsTask) {
    apply(plugin = "com.google.gms.google-services")
}

方案2:通过变体容器精准判断(严谨版)

利用Gradle的afterEvaluate回调,在构建模型生成后,针对当前目标变体做精准判断:

plugins {
    id("com.android.application")
    // 先声明插件但不立即应用
    id("com.google.gms.google-services") apply false
}

android {
    // 配置风味维度与变体
    flavorDimensions += "serviceType"
    productFlavors {
        create("gms") {
            dimension = "serviceType"
        }
        create("nogms") {
            dimension = "serviceType"
        }
    }
}

afterEvaluate {
    // 处理Android Studio同步场景
    val selectedVariant = System.getProperty("android.injected.build.variant")
    // 处理命令行任务场景,匹配任务对应的变体
    val targetVariants = gradle.startParameter.taskNames
        .mapNotNull { taskName ->
            android.applicationVariants.find {
                taskName.contains(it.name, ignoreCase = true)
            }
        }

    // 判断是否需要应用插件
    val shouldApply = if (targetVariants.isEmpty()) {
        selectedVariant == null || !selectedVariant.contains("nogms")
    } else {
        targetVariants.none { it.name.contains("nogms") }
    }

    if (shouldApply) {
        pluginManager.apply("com.google.gms.google-services")
    }
}

注意事项

  • Google Services插件会自动处理google-services.json文件,若你的nogms变体不需要该文件,建议将其放在对应风味的资源目录下(如src/nogms/google-services.json),或直接移除该文件并在nogms变体中禁用相关配置。
  • 若使用命令行构建,确保任务名称包含变体标识(如assembleNogmsDebug),方案会自动识别并跳过插件应用。

内容的提问来源于stack exchange,提问作者lannyf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:07:45