now - android build variants
Defina buildconfigfield para un sabor especĂfico Y buildType (6)
Aquí hay una solución sin fallas que he descrito en la respuesta de 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]}/""
}
Tengo 2 sabores, digamos vainilla y chocolate. También tengo tipos de compilación Debug and Release, y necesito que Vanilla Release tenga un campo verdadero, mientras que las otras 3 combinaciones deberían ser falsas.
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
}
Tengo un error, así que supongo que el truco de eliminación de errores y versiones no funciona. ¿Es posible hacer esto?
Así es como resolví esto:
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
}
}
(Todavía no he podido determinar si ext.fields
existe en un sabor)
Dentro del sistema de compilación Gradle, buildTypes
y buildTypes
son desafortunadamente dos entidades separadas.
Por lo que sé, para completar lo que desea lograr, deberá crear otro sabor de construcción como tal:
buildTypes {
debug{}
release {}
}
productFlavors {
vanillaDebug {
buildConfigField BOOLEAN, VARIABLE, FALSE
}
vanillaRelease {
buildConfigField BOOLEAN, VARIABLE, TRUE
}
chocolate {
buildConfigField BOOLEAN, VARIABLE, FALSE
}
}
Haz un bucle con las variantes y comprueba sus nombres:
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"
}
}
Para su caso específico, también puede jugar con defaultConfig:
defaultConfig {
buildConfigField BOOLEAN, VARIABLE, TRUE
}
buildTypes {
debug {
buildConfigField BOOLEAN, VARIABLE, FALSE
}
release {
}
}
productFlavors {
VANILLA {
}
CHOCOLATE {
buildConfigField BOOLEAN, VARIABLE, FALSE
}
}
El valor predeterminado es VERDADERO, pero luego pone FALSE en todas las compilaciones de Debug y en todas las compilaciones de Chocolate. Entonces, el único VERDADERO que queda es el lanzamiento de VANILLA.
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
}
}
}