排除特定的构建变体

时间:2014-01-19 19:58:01

标签: android gradle android-gradle

我有两种默认的构建类型:debug / release和几种风格:prod / dev。

现在我想排除构建变体dev-release,但保留所有其他可能的组合。有没有办法实现这个目标?

9 个答案:

答案 0 :(得分:97)

变体过滤器

使用gradle android插件的variantFilter将某些组合标记为忽略。以下是official documentation中与范围维度相关的示例,并说明了如何使用它:

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

答案 1 :(得分:14)

使用风味尺寸时尝试这个

List<AppSectionId>

答案 2 :(得分:10)

如果您使用风味尺寸,请执行以下操作:

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

它易于阅读,您可以针对特定的构建变体。

答案 3 :(得分:5)

像其他人一样使用变体过滤器我发现通过将变体名称与我想要保留的变体列表进行比较,最容易做到这一点。

因此,在我的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"
        }
    }
}

答案 4 :(得分:3)

此处的解决方案对我不起作用 - 我遇到了this post并将其添加到我的应用中的build.gradle中,它为我解决了问题

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

这就是它的作用 - 等待 gradle 汇编要执行的完整任务列表,然后它将所有与名称模式匹配的任务标记为已禁用

注意 匹配是准确的 - 上面的表达式可以匹配任何具有&#34; MyVariant&#34;在其中的某个地方,它是区分大小写的

答案 5 :(得分:1)

请参阅上面的变体过滤器答案。

旧答案:

目前不可能,但这是我们想要添加的东西。可能很快就会。

与此同时,您可以禁用我认为的汇编任务。像这样:

android.applicationVariants.all { variant ->
   if ("devRelease".equals(variant.name)) {
       variant.assembleTask.enabled = false
   }
}

答案 6 :(得分:1)

@ 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 ,但我已经粘贴了一些上下文以便于理解。

答案 7 :(得分:0)

一种更简单的方法

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

始终对此类情况进行有意义的评论。

答案 8 :(得分:0)

在Gradle的Kotlin DSL(即build.gradle.kts)中,应为:

variantFilter {
    ignore = buildType.name == "release" &&
             flavors.map { it.name }.contains("dev")
}