排除特定的构build变体

我有两个默认的构buildtypes:debugging/释放和几个口味:prod / dev。

现在我想排除构build变种dev-release,但保留所有其他可能的组合。 有没有办法做到这一点?

Solutions Collecting From Web of "排除特定的构build变体"

变体filter

从gradle插件0.9版本开始,可以指定一个变体filter。 把这样的东西放在gradle构build文件的根级别:

android.variantFilter { variant -> if(variant.buildType.name.equals('release') && variant.getFlavors().get(0).name.equals('vanilla')) { variant.setIgnore(true); } } 

如果你使用多口味的设置,你需要做相应的调整。

旧解决scheme:

泽维尔的答案不适合我,但我想出了这个工程,并给出了一个很好的错误信息:

 //Disable devRelease because that should not be possible to build android.applicationVariants.all { variant -> if ("devRelease".equals(variant.name)) { task assembleDevRelease(overwrite: true) << { throw new RuntimeException('Invalid build variant - devRelease should not be built! Did you mean to build prodRelease?'); } } } 

根据需要调整“devRelease”和“assembleDevRelease”。

当使用味道维度尝试这一个

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

这是很容易阅读,你可以针对特定的构build变种。

这里的解决scheme不适合我 – 我遇到这个post,并添加到build.gradle在我的应用程序,它解决了我的问题

 gradle.taskGraph.whenReady { graph -> graph.allTasks.findAll { it.name ==~ /.*MyVariant.*/ }*.enabled = false } 

这就是它所做的 – 等待gradle组装要执行的完整任务列表,然后将所有与名称模式匹配的任务标记为禁用

注意匹配是确切的 – 上面的expression式可以让您匹配任何名称中具有“MyVariant”的任务,并且区分大小写

请参阅上面的变体filter答案。

老答案:

目前还不可能,但这是我们想补充的。 可能很快。

在此期间,您可以禁用我认为的汇编任务。 像这样的东西:

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

你必须添加的代码是variantFilter ,但是我已经粘贴了一些上下文,以便于理解。

使用像其他人一样的变体filter,我发现通过比较变体名称和我想保留的变体列表来做到这一点是最简单的。

所以在我的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" } } }