如何仅为指定Product Flavor加载对应Gradle依赖与插件
注意:项目级buildscript配置的加载时机远早于模块productFlavors配置的解析,无法直接读取模块内的flavor规则做条件判断,需要通过识别当前构建任务的目标变体,来实现华为相关配置的按需加载,完全隔离非华为构建包内的华为SDK相关内容
实现步骤
1. 修改根目录(项目级)build.gradle
首先移除硬编码的华为Maven仓库、AGC插件classpath依赖,改为条件加载:
// 按需修改判断逻辑,匹配你的华为flavor命名 def isHuaweiBuild() { // 方案1:通过构建任务名自动判断,不需要额外传参 return gradle.startParameter.taskNames.any { it.toLowerCase().contains("huawei") } // 方案2(更精准,推荐):通过自定义构建参数判断,打华为包时加-PbuildHuawei=true即可 // return project.hasProperty("buildHuawei") && buildHuawei == "true" } buildscript { ext.kotlin_version = '1.5.20' repositories { google() jcenter() mavenCentral() // 仅华为构建时添加华为Maven源 if (isHuaweiBuild()) { maven { url 'https://developer.huawei.com/repo/' } } } dependencies { classpath 'com.android.tools.build:gradle:7.0.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' // 仅华为构建时添加AGC插件依赖 if (isHuaweiBuild()) { classpath 'com.huawei.agconnect:agcp:1.4.1.300' } } }
2. 修改App模块级build.gradle
移除文件顶部全局写的apply plugin: 'com.huawei.agconnect',改为仅针对华为flavor应用插件:
plugins { // 你原来的其他插件声明,比如com.android.application、kotlin-android等保持不变 } android { // 原有compileSdk、defaultConfig、buildTypes等配置保持不变 productFlavors { // 其他非华为flavor配置保持不变 huawei { // 原有华为flavor的配置保持不变 } } } // 放在android配置块之后,仅华为变体应用AGC插件 afterEvaluate { android.applicationVariants.all { variant -> // 这里的判断规则要和根目录build.gradle里的flavor命名匹配 if (variant.flavorName.toLowerCase().contains("huawei")) { apply plugin: 'com.huawei.agconnect' } } } // 你原来的dependencies依赖配置保持不变,已经做好的flavor维度华为依赖隔离不需要调整
3. 构建验证
- 构建非华为渠道包(比如Google Play渠道)时,指定对应flavor的构建任务,如果使用参数判断方案则不要携带
-PbuildHuawei=true参数,构建过程不会拉取华为Maven源的依赖,最终生成的安装包内不包含任何AGC相关类,不会触发Google Play的拒审规则 - 构建华为渠道包时,指定华为flavor构建任务,使用参数判断方案时携带
-PbuildHuawei=true参数,AGC插件会正常加载,华为地图相关功能可正常运行
注意:不要直接执行不带flavor维度的全量构建命令(比如直接运行
assemble),如果需要构建多个渠道包,按flavor分别执行构建任务即可,避免非华为包混入华为相关配置。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

