Android Gradle多Flavor按渠道引入HMS依赖不生效问题
问题根因
这个问题的核心是对Gradle构建生命周期和产品风味的依赖机制理解有偏差:
- Gradle构建分为配置、执行两个阶段,配置阶段会全量执行所有build.gradle中的逻辑,和当前构建选中的产品风味无关。你写在
huawei_client风味闭包里的rootProject.ext.useHuaweiLib = true,不管构建时选client、sdk还是huawei_client,配置阶段跑到这段代码就会把全局变量从默认false改成true,等执行到后续依赖加载的if判断时,条件永远成立,所以所有风味都会引入HMS依赖,选非华为风味时自然也能访问到HMS的API。 - 额外的配置错误:
defaultConfig是和productFlavors平级的配置块,你把它写到productFlavors块内部不符合Gradle规范,会导致配置继承逻辑异常。 - 你用全局变量+if判断控制风味依赖的思路本身就不适配Gradle的构建模型,Gradle原生提供了风味专属依赖的配置能力,完全不需要手写判断逻辑。
修正步骤
按照以下方式修改配置即可实现按风味加载对应依赖的效果:
- 清理无效的旧配置
- 删除根模块
ext块中的useHuaweiLib = false全局变量声明 - 删除app模块dependencies块中,通过判断
useHuaweiLib加载HMS依赖的if代码段 - 把误写到
productFlavors块内部的defaultConfig配置块,挪到和productFlavors平级的位置,删除各风味中重复的默认USE_HUAWEI_LIB配置 - 删除
huawei_client风味块中修改全局useHuaweiLib变量的赋值代码
- 删除根模块
- 编写正确的产品风味配置
android { // 保留原有的compileSdkVersion、buildToolsVersion、defaultConfig中的基础配置 flavorDimensions "purpose" defaultConfig { // 原有的applicationId、minSdkVersion、targetSdkVersion等配置保留 buildConfigField "boolean", "USE_HUAWEI_LIB", "false" } productFlavors { client { dimension "purpose" } huawei_client{ dimension "purpose" buildConfigField "boolean", "USE_HUAWEI_LIB", "true" } sdk { dimension "purpose" } } } - 配置风味专属依赖
注意命名规则:如果风味名用下划线分隔,在依赖配置项中需要转为小驼峰格式,比如huawei_client对应的依赖配置前缀为huaweiClientdependencies { // 所有风味通用的依赖写在这里,比如基础三方库、业务组件等 implementation 'androidx.appcompat:appcompat:1.6.1' // 以下HMS依赖仅在构建huawei_client风味时才会引入,其余风味不会打包相关代码 huaweiClientImplementation 'com.huawei.agconnect:agconnect-core:1.4.1.300' huaweiClientImplementation 'com.huawei.hms:push:5.0.1.300' } - 配置修改完成后,执行
./gradlew clean命令清理旧的构建缓存,再选择对应风味构建即可。此时构建非华为风味时,HMS依赖不会被引入,代码中也无法访问HMS相关API,符合预期。
内容的提问来源于stack exchange,提问作者Danil.B
相关产品推荐
相关产品推荐

