如何在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块内实现条件加载,可以通过预编译脚本插件实现:
- 在项目根目录创建
buildSrc/src/main/kotlin目录(若不存在) - 创建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") } }
- 创建华为插件配置类
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") } }
- 配置
buildSrc/build.gradle.kts确保依赖正确:
plugins { `kotlin-dsl` } repositories { mavenCentral() google() }
- 在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
相关产品推荐
相关产品推荐

