如何基于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
相关产品推荐
相关产品推荐

