Подтвердить что ты не робот

Исключить конкретные варианты сборки

У меня есть два типа сборки по умолчанию: debug/release и несколько вариантов: prod/dev.

Теперь я хочу исключить вариант сборки dev-release, но сохранить все остальные возможные комбинации. Есть ли способ достичь этого?

4b9b3361

Ответ 1

Вариант фильтра

Используйте вариант-фильтр подключаемого модуля 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)
        }
    }
}

Ответ 2

При работе с размерами вкуса попробуйте этот

variantFilter { variant ->
    def dim = variant.flavors.collectEntries {
        [(it.productFlavor.dimension): it.productFlavor.name]
    }

    if (dim.dimensionOne == 'paid' && dim.dimensionSecond == 'someVal') {
        variant.setIgnore(true);
    }
}

Ответ 3

Если вы используете размеры аромата, сделайте следующее:

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

Легко читается, и вы можете настраивать конкретные варианты сборки.

Ответ 4

Используя альтернативные фильтры, такие как другие, я обнаружил, что проще всего это сделать, сравнивая имя варианта со списком вариантов, которые я хочу сохранить.

Итак, в моем файле 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"
        }
    }
}

Ответ 5

Решения здесь не сработали для меня - я столкнулся с this post и добавил это для build.gradle в моем приложении, и он решил проблему для меня

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

Это то, что он делает - ждет, пока gradle соберет полный список выполняемых задач, а затем отметит все задачи, которые соответствуют шаблону имен, как отключенные

Примечание Точное совпадение - вышеприведенное выражение позволяет вам сопоставлять любую задачу с именем "MyVariant" где-то в ней, и она чувствительна к регистру

Ответ 6

См. ответ фильтра фильтров выше.

Старый ответ:

В настоящий момент это невозможно, но это то, что мы хотим добавить. Вероятно, скоро.

Тем временем вы можете отключить задачу сборки, я думаю. Что-то вроде этого:

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

Ответ 7

Ответ @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, но я немного вложил контекст, чтобы его было легко понять.

Ответ 8

Еще один более простой способ

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

Пожалуйста, всегда оставляйте содержательный комментарий к таким вещам.