para - manual de programacion android pdf
Excluir variantes de compilación específicas (7)
Tengo los dos tipos de compilación predeterminados: depurar / liberar y un par de sabores: prod / dev.
Ahora quiero excluir la variante de compilación de desarrollo, pero mantener todas las otras combinaciones posibles. ¿Hay una manera de lograr esto?
Filtro de variantes
Utilice la varianteFiltro del plugin android gradle para marcar ciertas combinaciones como ignoradas. Aquí hay un ejemplo de la documentación oficial que funciona con las dimensiones de sabor y muestra cómo se puede usar:
android {
...
buildTypes {...}
flavorDimensions "api", "mode"
productFlavors {
demo {...}
full {...}
minApi24 {...}
minApi23 {...}
minApi21 {...}
}
variantFilter { variant ->
def names = variant.flavors*.name
// To check for a certain build type, use variant.buildType.name == "<buildType>"
if (names.contains("minApi21") && names.contains("demo")) {
// Gradle ignores any variants that satisfy the conditions above.
setIgnore(true)
}
}
}
Como dice el comentario, también puedes verificar buildType así:
android {
variantFilter { variant ->
def names = variant.flavors*.name
if(variant.buildType.name == ''release'' && names.contains("myforbiddenflavor")) {
setIgnore(true)
}
}
}
Cuando se trabaja con dimensiones de sabor, pruebe este
variantFilter { variant ->
def dim = variant.flavors.collectEntries {
[(it.productFlavor.dimension): it.productFlavor.name]
}
if (dim.dimensionOne == ''paid'' && dim.dimensionSecond == ''someVal'') {
variant.setIgnore(true);
}
}
La respuesta de @ ade.se no funcionó para mí. Pero he luchado un poco, y he escrito esto, eso funciona muy bien:
android {
compileSdkVersion 22
buildToolsVersion ''20.0.0''
variantFilter { variant ->
if (variant.buildType.name.equals(''debug'') || variant.buildType.name.equals(''release'')) {
variant.setIgnore(true);
}
}
defaultConfig {
applicationId "com.fewlaps.quitnow"
minSdkVersion 15
targetSdkVersion 22
versionCode 35
versionName "1.35"
}
El código que debe agregar es el variantFilter uno, pero he pegado un poco del contexto para que sea fácil de entender.
Las soluciones aquí no me funcionaron, me encontré con esta publicación y agregué esto a build.gradle en mi aplicación y me solucionó el problema
gradle.taskGraph.whenReady { graph ->
graph.allTasks.findAll { it.name ==~ /.*MyVariant.*/ }*.enabled = false
}
Esto es lo que hace: espera a que Gradle ensamble la lista completa de tareas para ejecutar y luego marca todas las tareas que coinciden con el patrón del nombre como deshabilitado.
NOTA La coincidencia es exacta: la expresión anterior le permite hacer coincidir cualquier tarea que tenga "MyVariant" en algún lugar de su nombre y es sensible a mayúsculas y minúsculas.
Si usa dimensiones de sabor, haga esto:
flavorDimensions "device", "server"
productFlavors {
emulator {
dimension = "device"
}
phone {
dimension = "device"
}
staging {
dimension = "server"
}
production {
dimension = "server"
}
}
android.variantFilter { variant ->
def device = variant.getFlavors().get(0).name
def server = variant.getFlavors().get(1).name
def isRelease = variant.buildType.name.equals(''release'')
def isDebug = variant.buildType.name.equals(''debug'')
// Disable emulatorProductionRelease build variant
if (device.equals(''emulator'') && server.equals(''production'') && isRelease) {
variant.setIgnore(true)
}
}
Es fácil de leer y puede dirigirse a variantes de compilación específicas.
Usando filtros de variantes como otros, encontré que era más fácil hacer esto comparando el nombre de la variante con una lista de variantes que quiero conservar.
Entonces en mi archivo app/build.gradle
tengo algo como:
android {
variantFilter { variant ->
def needed = variant.name in [
''stagingQuickDebug'', // for development
''stagingFullDebug'', // for debugging all configurations
''stagingFullCandidate'', // for local builds before beta release
''stagingFullRelease'', // for beta releases
''productionFullCandidate'', // for local builds before going public
''productionFullRelease'' // for public releases
]
variant.setIgnore(!needed)
}
buildTypes {
debug {
}
release {
}
candidate.initWith(release)
}
flavorDimensions "server", "build"
productFlavors {
staging {
dimension "server"
buildConfigField "String", "API_URL", ''"https://example-preprod.com/"''
}
production {
dimension "server"
buildConfigField "String", "API_URL", ''"https://example.com/"''
}
quick {
dimension "build"
minSdkVersion 21
resConfigs("en", "xxhdpi")
}
full {
dimension "build"
}
}
}
Vea la respuesta del filtro Variant anterior.
Vieja respuesta:
No es posible en este momento, pero es algo que queremos agregar. Probablemente pronto
Mientras tanto, podrías deshabilitar la tarea de ensamblar, creo. Algo como esto:
android.applicationVariants.all { variant ->
if ("devRelease".equals(variant.name)) {
variant.assembleTask.enabled = false
}
}