You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}\"")
}

关键逻辑说明

  1. 获取组合变体的维度实例:每个variant包含了当前组合的所有flavor,通过dimension属性筛选出product和license维度对应的具体flavor对象,这样就能拿到各自的kind、license、scheme等属性。
  2. 设置变体专属属性:直接针对每个变体的mergedFlavor修改ApplicationId和Manifest占位符,确保每个组合变体都有独立的配置。
  3. BuildConfig字段生成:通过variant.buildConfigField为每个变体生成对应的常量,这样不同变体的BuildConfig会包含各自维度的属性值。

这样修改后,你就能得到预期的com.company.apple、eu.company.orange这类ApplicationId,Manifest中的${scheme}和${fileProvider}也会正确替换,BuildConfig字段也会和当前变体匹配。

内容的提问来源于stack exchange,提问作者Ankhwatcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:37:11