Подтвердить что ты не робот

Определить buildconfigfield для конкретного вкуса AND buildType

У меня есть 2 аромата, скажем, ваниль и шоколад. У меня также есть типы отладки и выпуска, и мне нужна версия Vanilla Release, чтобы иметь поле true, а остальные 3 комбинации должны быть ложными.

def BOOLEAN = "boolean"
def VARIABLE = "VARIABLE"
def TRUE = "true"
def FALSE = "false"

    VANILLA {

        debug {

            buildConfigField BOOLEAN, VARIABLE, FALSE

        }

        release {

            buildConfigField BOOLEAN, VARIABLE, TRUE

        }


    }

    CHOCOLATE {
        buildConfigField BOOLEAN, VARIABLE, FALSE
    }

У меня ошибка, поэтому я думаю, что отладка и трюк релиза не работают. Это можно сделать?

4b9b3361

Ответ 1

Прокрутите варианты и проверьте их имена:

productFlavors {
    vanilla {}
    chocolate {}
}

applicationVariants.all { variant ->
    println("Iterating variant: " + variant.getName())
    if (variant.getName() == "chocolateDebug") {
        variant.buildConfigField "boolean", "VARIABLE", "true"
    } else {
        variant.buildConfigField "boolean", "VARIABLE", "false"
    }
}

Ответ 2

Вот решение без недостатков, которое я описал в Ответ Simas

buildTypes {
    debug {}
    release {}
}

productFlavors {
    vanilla {
        ext {
            variable = [debug: "vanilla-debug value", release: "vanilla-release value"]
        }
    }
    chocolate {
        ext {
            variable = [debug: "chocolate-debug value", release: "chocolate-release value"]
        }
    }
}

applicationVariants.all { variant ->
    def flavor = variant.productFlavors[0]
    variant.buildConfigField "boolean", "VARIABLE", "\"${flavor.ext.variable[variant.buildType.name]}\""
}

Ответ 3

В системе построения Gradle buildTypes и productFlavors, к сожалению, находятся два отдельных объекта.

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

buildTypes {
        debug{}
        release {}
    }

    productFlavors {
        vanillaDebug {
             buildConfigField BOOLEAN, VARIABLE, FALSE
        }
        vanillaRelease {
             buildConfigField BOOLEAN, VARIABLE, TRUE
        }
        chocolate {
             buildConfigField BOOLEAN, VARIABLE, FALSE
        }
    }

Ответ 4

Вот как я решил это:

def GAME_DIMENSION = "game"
def BUILD_DIMENSION = "building"

flavorDimensions GAME_DIMENSION, BUILD_DIMENSION

productFlavors {
    lollipop {
        dimension BUILD_DIMENSION
        minSdkVersion 21
    }

    normal {
        dimension BUILD_DIMENSION
    }

    game_1 {
        dimension GAME_DIMENSION
        ext {
            fields = [
                    [type: 'String', name: 'TESTSTRING', values: [debug: 'debugstring', release: 'releasestring']],
                    [type: 'int', name: 'TESTINT', values: [debug: '1234', release: '31337']]
            ]
        }
    }

    game_2 {
        dimension GAME_DIMENSION
        ext {
            fields = []  // none for game_2
        }
    }
}

applicationVariants.all { variant ->

    // get the GAME dimension flavor
    def game = variant.getProductFlavors()
            .findAll({ flavor -> flavor.dimension == GAME_DIMENSION})
            .get(0)

    println "Adding " + game.ext.fields.size() + " custom buildConfigFields for flavor " + variant.name

    // loop over the fields and make appropriate buildConfigField
    game.ext.fields.each { field ->
        def fldType = field['type']
        def fldName = field['name']
        def fldValues = field['values']

        // get debug/release specific value from values array
        def fldSpecificValue = fldValues[variant.getBuildType().name]

        // add quotes for strings
        if (fldType == 'String') {
            fldSpecificValue = '\"' + fldSpecificValue + '\"'
        }

        println "    => " + fldType + " " + fldName + " = " + fldSpecificValue
        variant.buildConfigField fldType, fldName, fldSpecificValue
    }
}

(Я еще не смог определить, существует ли ext.fields на вкус)

Ответ 5

Вы можете попробовать это для нескольких ароматов продуктов:

productFlavors {
        demo {
            applicationId "com.demo"
            versionCode 1
            versionName '1.0'
            ext {
                APP_BASE_URL = [debug: "${BASE_URL_DEV}", release: "${BASE_URL_PRODUCTION}"]
            }
        }
        demo1 {
            applicationId "com.demo1"
            versionCode 1
            versionName '1.2'
            ext {
                APP_BASE_URL = [debug: "${BASE_URL_DEV}", release: "${BASE_URL_PRODUCTION}"]
            }
        }


    applicationVariants.all { variant ->
            def flavor = variant.productFlavors[0]
            variant.buildConfigField "String", "BASE_URL", "${flavor.ext.APP_BASE_URL[variant.buildType.name]}"
        }

Ответ 6

Попробуйте следующее:

   applicationVariants.all { variant ->
        def PRODUCT_IDENTIFIER = "PRODUCT_IDENTIFIER"
        def SERVER_URL = "SERVER_URL"

        def flavor = variant.productFlavors[0].name
        def buildType = variant.buildType.name

        if( flavor == "Demo") {
            buildConfigField "String", "PRODUCT_IDENTIFIER", "\"identifier_DEMO\""
        }
        else if( flavor == "Test") {
            buildConfigField "String", "PRODUCT_IDENTIFIER", "\"identifier_TEST\""
        }

        if( buildType == "debug" ) {
            variant.buildConfigField "String", "SERVER_URL", "\"https://myserver.com/debug\""
        }
        else if( buildType == "release" ) {
            variant.buildConfigField "String", "SERVER_URL", "\"https://myserver.com/release\""
        }
    }

Тогда со стороны Java:

String identifier = BuildConfig.HOTEL_IDENTIFIER;
String serverUrl = BuildConfig.SERVER_URL

приведет к:

DemoDebug

identifier -> "identifier_DEMO"
serverUrl -> "https://myserver.com/debug"

DemoRelease

identifier -> "identifier_DEMO"
serverUrl -> "https://myserver.com/release"

TestDebug

identifier -> "identifier_TEST"
serverUrl -> "https://myserver.com/debug"

TestRelease

identifier -> "identifier_TEST"
serverUrl -> "https://myserver.com/release"

Ответ 7

productFlavors {
    vanilla {}
    chocolate {}
}

buildTypes {
        release {
            productFlavors.vanilla {
                //your configuration for vanilla flavor with release buildType
            }
        }
        debug {
            productFlavors.chocolate{
                //your configuration for chocolate flavor with debug buildType
            }
        }
    }

Ответ 8

Для вашего конкретного случая вы также можете просто поиграть с defaultConfig:

defaultConfig {
    buildConfigField BOOLEAN, VARIABLE, TRUE
}

buildTypes {
    debug {
        buildConfigField BOOLEAN, VARIABLE, FALSE
    }
    release {
    }
}

productFlavors {
    VANILLA {
    }
    CHOCOLATE {
        buildConfigField BOOLEAN, VARIABLE, FALSE
    }
}

Значением по умолчанию является TRUE, но затем вы устанавливаете FALSE для всех сборок Debug и всех сборок Chocolate. Таким образом, единственная оставшаяся ИСТИНА - VANILLA-релиз.