Gradle多Flavor维度组合时动态生成ApplicationId及配置问题
解决Flavor维度组合下ApplicationId与BuildConfig字段生成问题
你猜的没错!问题根源就是你在遍历单独的Product Flavor,而不是两个维度组合后的Build Variant。每个单独的product flavor(比如apple)没有license属性,每个单独的license flavor(比如com)也没有kind属性,拼接时自然会出现null。
要解决这个问题,你需要遍历Android构建系统生成的组合变体列表,每个变体都是product和license两个维度的组合(比如apple-com、orange-eu这类),这样就能同时获取到两个维度的属性值。
修改后的完整Gradle脚本
只需要替换你脚本最后那段productFlavors.all的代码,其他部分保持不变:
flavorDimensions "product", "license" productFlavors.all { ext.scheme = null ext.scheme_tail = "" ext.kind = null ext.license = null } productFlavors { apple { dimension "product" kind = "apple" scheme = "companyapple" } orange { dimension "product" kind = "orange" scheme = "companyorange" } kiwi { dimension "product" kind = "kiwi" scheme = "companykiwi" } com { dimension "license" license = "com" scheme_tail = '' } eu { dimension "license" license = "eu" scheme_tail = "eu" } uk { dimension "license" license = "uk" scheme_tail = "uk" } } // 替换原来的productFlavors.all,改为遍历组合变体 android.applicationVariants.all { variant -> // 从当前变体中分别获取product和license维度的flavor实例 def productFlavor = variant.productFlavors.find { it.dimension == "product" } def licenseFlavor = variant.productFlavors.find { it.dimension == "license" } // 拼接所需的属性值 def appId = "${licenseFlavor.license}.company.${productFlavor.kind}" def scheme = "${productFlavor.scheme}${licenseFlavor.scheme_tail}" def fileProvider = "${appId}.fileprovider" // 设置当前变体的ApplicationId variant.mergedFlavor.applicationId = appId // 更新Manifest占位符 variant.mergedFlavor.manifestPlaceholders += [ scheme: scheme, fileProvider: fileProvider ] // 添加BuildConfig字段 variant.buildConfigField("String", "FILE_PROVIDER", "\"${fileProvider}\"") variant.buildConfigField("String", "SCHEME", "\"${scheme}\"") variant.buildConfigField("String", "KIND", "\"${productFlavor.kind}\"") variant.buildConfigField("String", "LICENSE", "\"${licenseFlavor.license}\"") }
关键逻辑说明
- 获取组合变体的维度实例:每个
variant包含了当前组合的所有flavor,通过dimension属性筛选出product和license维度对应的具体flavor对象,这样就能拿到各自的kind、license、scheme等属性。 - 设置变体专属属性:直接针对每个变体的
mergedFlavor修改ApplicationId和Manifest占位符,确保每个组合变体都有独立的配置。 - BuildConfig字段生成:通过
variant.buildConfigField为每个变体生成对应的常量,这样不同变体的BuildConfig会包含各自维度的属性值。
这样修改后,你就能得到预期的com.company.apple、eu.company.orange这类ApplicationId,Manifest中的${scheme}和${fileProvider}也会正确替换,BuildConfig字段也会和当前变体匹配。
内容的提问来源于stack exchange,提问作者Ankhwatcher
相关产品推荐
相关产品推荐

