在Gradle风味维度中合并BuildConfig变量

7
在我的Android应用程序中,我有两个口味维度:“品牌”(brand1、brand2)和“环境”(staging、production)。一段时间后,我添加了“环境”维度,并且之前为不同品牌定义了一些BuildConfig变量。更具体地说,我像这样定义了BASE_URL
flavorDimensions 'brand'
productFlavors {

    brand1 {
        dimension 'brand'
        ...
        buildConfigField "String", "BASE_URL", "\"http://brand.one.api/\""
        ...
    }

    brand2 {
        dimension 'brand'
        ...
        buildConfigField "String", "BASE_URL", "\"http://brand.two.api/\""
        ...
    }
}

现在,我添加了“环境”维度,我想设置四个不同的端点:
  1. Brand1-staging: "http://brand.one.staging.api/"
  2. Brand1-production: "http://brand.one.production.api/"
  3. Brand2-staging: "http://brand.two.staging.api/"
  4. Brand2-production: "http://brand.two.production.api/"
但我无法弄清如何为特定组合的口味维度创建BuildConfig变量。使用裸gradle是否可能?
谢谢
3个回答

2
经过进一步调查,我在这里找到了一个类似的问题。 看起来你需要添加一个函数来迭代构建变体名称,并检查它们是否与某个期望的名称匹配。
我的问题是实际上我有三个维度:"品牌"、"环境"和"api"(15用于生产和21用于调试与即时运行)。所以变量名称看起来像brand1Api15StagingDebug,...,brand2Api21ProductionRelease,...等等。
我在这里需要一些groovy正则表达式匹配结合上面链接的问题。 最后我制作的函数看起来像这样:
android.applicationVariants.all { variant ->
    if (variant.getName() ==~ /brand1Api[0-9]{2}Staging.*/) {
        variant.buildConfigField "String", "BASE_URL", "\"http://brand.one.staging.api//\""
    } else if(variant.getName() ==~ /brand1Api[0-9]{2}Production.*/){
        variant.buildConfigField "String", "BASE_URL", "\"http://brand.one.production.api/\""
    } else if(variant.getName() ==~ /brand2Api[0-9]{2}Staging.*/) {
        variant.buildConfigField "String", "BASE_URL", "\"http://brand.two.staging.api//\""
    } else if(variant.getName() ==~ /brand2Api[0-9]{2}Production.*/){
        variant.buildConfigField "String", "BASE_URL", "\"http://brand.two.production.api/\""
    } else {
        throw new Exception("Unexpected variant name: " + variant.getName())
    }
}

我在链的末尾添加了一个异常抛出,以便如果有人将变量名称更改为此处未经检查的名称,则构建将失败。这很重要,可以避免使用错误的端点构建应用程序。

运行得非常好。


1
请看一下我的解决方案,我认为它保留了你的解决方案最好的部分,并且使其更易读。 - Alexey Bukin

1
我做了类似于这样的事情,将口味和品牌结合在一起。
flavorDimensions "brand", "server"
productFlavors {

    brand1 {
        dimension 'brand'
        ...
        buildConfigField "String", "BASE_URL_STAGING", "\"http://brand.one.staging.api/\""
        buildConfigField "String", "BASE_URL_PRODUCTION", "\"http://brand.one.production.api/\""
        ...
    }

    brand2 {
        dimension 'brand'
        ...
        buildConfigField "String", "BASE_URL_STAGING", "\"http://brand.two.staging.api/\""
        buildConfigField "String", "BASE_URL_PRODUCTION", "\"http://brand.two.production.api/\""
        ...
    }

    staging {
        dimension 'server'
        buildConfigField "String", "BASE_URL", 'BuildConfig.BASE_URL_STAGING'
    }

     production {
       dimension 'server'
       buildConfigField "String", "BASE_URL", 'BuildConfig.BASE_URL_PRODUCTION'

    }


}

1

您可以定义一个味道维度,以拥有多个值,以便稍后选择一个特定的值。 首先,将这些值添加到味道中:

productFlavors.all {
    ext.myAnalyticsUrl = [dev: null, test: null, production: null]
}

然后为一个口味定义所有值:

    flavor1 {
            dimension "region"
            myAnalyticsUrl = [
                    dev: *devUrl*,
                    test: *testUrl*,
                    production: *productionUrl*
            ]
    }

    dev {
            dimension "environment"
            ...
    }
    test {
            dimension "environment"
            ...
    }
    production {
            dimension "environment"
            ...
    }

现在超出了android的范围:

android.applicationVariants.all { variant ->

    def regionFlavor = variant.productFlavors.find{ flavor -> flavor.getFlavorDimension() == "region" }
    def environmentFlavor = variant.productFlavors.find{ flavor -> flavor.getFlavorDimension() == "environment" }

    def analyticsUrl = regionFlavor.myAnalyticsUrl[environmentFlavor.name]
}

希望能对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接