У меня есть два типа сборки по умолчанию: debug/release и несколько вариантов: prod/dev.
Теперь я хочу исключить вариант сборки dev-release, но сохранить все остальные возможные комбинации. Есть ли способ достичь этого?
У меня есть два типа сборки по умолчанию: debug/release и несколько вариантов: prod/dev.
Теперь я хочу исключить вариант сборки dev-release, но сохранить все остальные возможные комбинации. Есть ли способ достичь этого?
Используйте вариант-фильтр подключаемого модуля Android для пометки определенных комбинаций как игнорируемых. Вот пример из официальной документации, которая работает с размерами аромата и показывает, как его можно использовать:
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)
}
}
}
Как говорится в комментарии, вы также можете проверить buildType следующим образом:
android {
variantFilter { variant ->
def names = variant.flavors*.name
if(variant.buildType.name == 'release' && names.contains("myforbiddenflavor")) {
setIgnore(true)
}
}
}
При работе с размерами вкуса попробуйте этот
variantFilter { variant ->
def dim = variant.flavors.collectEntries {
[(it.productFlavor.dimension): it.productFlavor.name]
}
if (dim.dimensionOne == 'paid' && dim.dimensionSecond == 'someVal') {
variant.setIgnore(true);
}
}
Если вы используете размеры аромата, сделайте следующее:
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)
}
}
Легко читается, и вы можете настраивать конкретные варианты сборки.
Используя альтернативные фильтры, такие как другие, я обнаружил, что проще всего это сделать, сравнивая имя варианта со списком вариантов, которые я хочу сохранить.
Итак, в моем файле app/build.gradle
у меня есть что-то вроде:
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"
}
}
}
Решения здесь не сработали для меня - я столкнулся с this post и добавил это для build.gradle в моем приложении, и он решил проблему для меня
gradle.taskGraph.whenReady { graph ->
graph.allTasks.findAll { it.name ==~ /.*MyVariant.*/ }*.enabled = false
}
Это то, что он делает - ждет, пока gradle соберет полный список выполняемых задач, а затем отметит все задачи, которые соответствуют шаблону имен, как отключенные
Примечание Точное совпадение - вышеприведенное выражение позволяет вам сопоставлять любую задачу с именем "MyVariant" где-то в ней, и она чувствительна к регистру
См. ответ фильтра фильтров выше.
Старый ответ:
В настоящий момент это невозможно, но это то, что мы хотим добавить. Вероятно, скоро.
Тем временем вы можете отключить задачу сборки, я думаю. Что-то вроде этого:
android.applicationVariants.all { variant ->
if ("devRelease".equals(variant.name)) {
variant.assembleTask.enabled = false
}
}
Ответ @ade.se не работал у меня. Но я немного потрудился и написал это, что отлично работает:
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"
}
Код, который вы должны добавить, - это вариантFilter, но я немного вложил контекст, чтобы его было легко понять.
Еще один более простой способ
android.variantFilter { variant ->
if (variant.name == "qaDebug" || variant.name == "devRelease") {
setIgnore(true)
}
}
Или если вы поместите этот код в закрытие android {}
, android.
можно опустить
android {
// Please always specify the reason for such filtering
variantFilter { variant ->
if (variant.name == "qaDebug" || variant.name == "devRelease") {
setIgnore(true)
}
}
}
Пожалуйста, всегда оставляйте содержательный комментарий к таким вещам.