Объединенные переменные BuildConfig в измерениях Gradle

В моем приложении для Android у меня есть два измерения вкуса: "бренд" (brand1, brand2) и "среда" (постановка, производство). Через некоторое время я добавил измерение "среда", и ранее я определил некоторые 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-постановка: " http://brand.one.staging.api/"
  2. Brand1-production: " http://brand.one.production.api/"
  3. Brand2-постановка: " http://brand.two.staging.api/"
  4. Brand2-production: " http://brand.two.production.api/"

Но я не могу понять, как создать BuildConfig переменная для конкретной комбинации размеров аромата. Это возможно даже с голым грейдером?

Спасибо

3 ответа

Решение

После некоторого дальнейшего исследования я нашел подобный вопрос здесь.

Кажется, вам нужно добавить функцию, чтобы перебрать имена вариантов сборки и проверить, соответствуют ли они некоторым нужным именам.

Моя проблема заключалась в том, что на самом деле у меня было 3 измерения: "бренд", "среда" и "API" (15 для производства и 21 для отладки с мгновенным запуском). Таким образом, название варианта будет выглядеть как brand1Api15StagingDebug, ..., brand2Api21ProductionRelease, ... и т. Д.

Здесь мне нужно было какое-то отличное сопоставление регулярных выражений в сочетании со связанным вопросом выше. Наконец, функция, которую я сделал, выглядит так:

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())
    }
}

Я добавил исключение в конце цепочки, поэтому, если кто-либо изменит имена вариантов на непроверенные, сборка будет неудачной. Это важно, чтобы избежать создания приложений с неправильными конечными точками.

Работает как шарм.

Я сделал что-то вроде этого, сочетая вкус и марку вместе.

      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'

    }


}

Вы можете определить одно измерение вкуса, чтобы оно имело несколько значений, чтобы позже выбрать одно конкретное значение. Сначала добавьте эти значения в ароматы:

      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]
}

Надеюсь, поможет!

Другие вопросы по тегам