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

如何在Android新plugins块中按产品风味动态加载Google/Huawei插件

按产品风味动态加载Gradle插件(新plugins块兼容方案)

问题场景

现有Android应用包含两个产品风味,配置如下:

productFlavors {
    googlePlay {
        versionCode 65
        versionName "6.1"
    }
    appGallery {
        versionCode 5
        versionName "1.0.3"
    }
}

需要根据当前选中的风味,动态加载Google或华为对应的Gradle插件。旧版使用apply plugin的方式可以实现:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

if (getGradle().getStartParameter().getTaskRequests().toString().contains("Google")) {
    apply plugin: 'com.google.gms.google-services' // Google Services插件
    apply plugin: 'com.google.firebase.crashlytics'
} else {
    apply plugin: 'com.huawei.agconnect'
}

但使用Android Studio Electric创建的新项目采用了新的plugins块结构,直接在块内添加条件判断会报错:

only id(String), alias(Provider), or alias(ProviderConvertible) method calls allowed in plugins {} script block

可行解决方案

方案1:混合plugins块与apply plugin

保持plugins块声明基础插件,将条件加载逻辑移到块外,沿用原来的apply plugin语法:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.kapt'
}

// 在plugins块外部执行条件加载
if (getGradle().getStartParameter().getTaskRequests().toString().contains("Google")) {
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'com.google.firebase.crashlytics'
} else {
    apply plugin: 'com.huawei.agconnect'
}

方案2:使用pluginManager.apply()(更规范写法)

用Gradle提供的pluginManager替代直接apply plugin,写法更符合现代Gradle规范:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.kapt'
}

def isGoogleFlavor = getGradle().getStartParameter().getTaskRequests().toString().contains("Google")
if (isGoogleFlavor) {
    pluginManager.apply 'com.google.gms.google-services'
    pluginManager.apply 'com.google.firebase.crashlytics'
} else {
    pluginManager.apply 'com.huawei.agconnect'
}

方案3:预编译脚本插件(优雅长期方案)

如果希望完全在plugins块内实现条件加载,可以通过预编译脚本插件实现:

  1. 在项目根目录创建buildSrc/src/main/kotlin目录(若不存在)
  2. 创建Google插件配置类GooglePluginConfig.kt:
import org.gradle.api.Plugin
import org.gradle.api.Project

class GooglePluginConfig : Plugin<Project> {
    override fun apply(project: Project) {
        project.plugins.apply("com.google.gms.google-services")
        project.plugins.apply("com.google.firebase.crashlytics")
    }
}
  1. 创建华为插件配置类HuaweiPluginConfig.kt:
import org.gradle.api.Plugin
import org.gradle.api.Project

class HuaweiPluginConfig : Plugin<Project> {
    override fun apply(project: Project) {
        project.plugins.apply("com.huawei.agconnect")
    }
}
  1. 配置buildSrc/build.gradle.kts确保依赖正确:
plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
    google()
}
  1. 在app模块的build.gradle中使用:
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.kapt'
    id 'GooglePluginConfig' apply: getGradle().getStartParameter().getTaskRequests().toString().contains("Google")
    id 'HuaweiPluginConfig' apply: !getGradle().getStartParameter().getTaskRequests().toString().contains("Google")
}

注意事项

  • 任务名判断依赖于风味对应的任务前缀,比如googlePlay风味的任务为googlePlayDebug、googlePlayRelease,因此判断字符串包含"Google"是有效的
  • 预编译脚本插件需要确保buildSrc目录结构和配置正确,Gradle会自动编译该目录下的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:16:06