Android Studio多维度Product Flavor分Build Type配置源码集问题
解决多维度Product Flavor下按Build Type关联子集文件夹的问题
当使用2个及以上维度的Product Flavor时,ADT/Gradle默认不支持通过Flavor子集(如appleRed)来覆盖配置。举个例子:定义了apple/orange(水果维度)、red/green/yellow(颜色维度)、bad/good(版本维度)三个Flavor维度后,默认只能创建apple、orange、appleRedBad这类完整组合的资源/Java文件夹,无法直接使用appleRed这类子集文件夹,必须复制文件到所有完整组合文件夹中,操作冗余。
此前的方案可以实现普通子集文件夹的配置,但无法区分Build Type(Debug/Release),如果直接添加variant.buildType.name,会把appleYellowDebug这类文件夹同时关联到Debug和Release构建中。以下是能实现仅为指定Build Type添加对应子集文件夹的通用配置:
android { // 其他配置... applicationVariants.all { variant -> def flavorNames = variant.productFlavors*.name def buildTypeName = variant.buildType.name def fullVariantName = variant.name // 生成所有可能的Flavor子集组合(包含Build Type的情况) def flavorCombinations = [] // 生成不带Build Type的子集(如appleRed) for (int i = 0; i < flavorNames.size(); i++) { def combo = flavorNames.take(i + 1).join('') flavorCombinations.add(combo) } // 生成带Build Type的子集(如appleRedDebug) flavorCombinations.addAll(flavorCombinations.collect { it + buildTypeName.capitalize() }) // 为每个子集组合关联对应的源码和资源目录,仅当目录存在时添加 flavorCombinations.each { combo -> def srcDir = "src/$combo/java" def resDir = "src/$combo/res" if (file(srcDir).exists()) { android.sourceSets."$fullVariantName".java.srcDirs += srcDir } if (file(resDir).exists()) { android.sourceSets."$fullVariantName".res.srcDirs += resDir } } } }
代码说明
- 核心信息获取:提取当前变体的Flavor名称列表、Build Type名称,以及完整变体名称(如
appleRedBadDebug); - 子集组合生成:先生成所有不带Build Type的Flavor层级子集(3个维度下会生成
apple、appleRed、appleRedBad),再基于这些子集生成带Build Type的版本(如appleDebug、appleRedDebug); - 存在性校验关联:仅当对应的源码/资源文件夹实际存在时,才将其添加到当前变体的目录集合中,避免无效配置。
配置完成后,你可以直接创建appleRedDebug、orangeGreenRelease这类仅对应特定Build Type的子集文件夹,Gradle会自动将其关联到对应的变体构建中,无需逐个手动配置。
内容的提问来源于stack exchange,提问作者José Gómez
相关产品推荐
相关产品推荐

