Как получить текущий тип buildType в конфигурации Android Gradle

21

Я хочу динамически добавлять зависимость в проекте Android Gradle на основе текущего типа buildType. Я знаю, что укажите тип buildType в зависимости

compile project(path: ':lib1', configuration: 'debug')

Но как я могу использовать текущий тип buildType, чтобы указать, какой вариант библиотеки, которую я хочу импортировать, чтобы сборка отладки или выпуска автоматически импортировала вариант отладки или выпуска библиотеки? Я хочу что-то вроде этого (где currentBuildType - это переменная, содержащая имя используемого в настоящее время buildType):

compile project(path: ':lib1', configuration: currentBuildType)

В проекте библиотеки, который я хочу импортировать, установлен publishNonDefault true , поэтому публикуются все buildTypes.

    
задан Arthur Dent 09.09.2014 в 09:41
источник
  • возможный дубликат вариантов сборки в Gradle для проекта библиотеки на Android –  Scott Barta 09.09.2014 в 17:46

6 ответов

9

Я не смог найти чистый способ получить текущий тип сборки во время фазы конфигурации Gradle. Вместо этого я определяю зависимость для каждого типа сборки отдельно:

debugCompile project(path: ':lib1', configuration: 'debug')
releaseCompile project(path: ':lib1', configuration: 'release')

Если у вас много типов построений и много зависимостей проектов, это может быть очень многословным, но можно добавить функцию, чтобы сделать зависимость однострочным. Вы должны добавить это в свой основной файл сборки Gradle:

subprojects {
    android {
        dependencies.metaClass.allCompile { dependency ->
            buildTypes.each { buildType ->
                "${buildType.name}Compile" project(path: ":${dependency.name}", configuration: buildType.name)
            }
        }
    }
}

Затем вы можете добавить зависимости проекта в своих модулях Gradle следующим образом:

allCompile project(':lib1')

Если вы также используете компоновку сборки, вам придется адаптировать решение. См. Эту ссылку для документации по этой функции: Ссылка

Обратите внимание, что команда Android работает над улучшением этого поведения: Ссылка

    
ответ дан Arthur Dent 13.10.2014 в 10:26
источник
  • Добавление вашего allCompile к моему классу android отлично работает, но добавление его в файл корневого градиента не работает. Кажется, что он применяется перед плагином Android, и как таковой он ломается: / –  neuron 10.11.2015 в 14:59
  • @neuron Попробуйте изменить подпроекты для всех проектов. Из документов: «Настраивает этот проект и каждый из его подпроектов. Этот метод выполняет данное закрытие против этого проекта и его подпроектов ». –  vganin 15.01.2016 в 17:15
  • Поскольку это не очевидно, как это работает для комбинации buildType и flavor, вот решение: поскольку конфигурация '<flavor> ReleaseCompile' или '<flavor> DebugCompile', как известно, не градуируется на этапе оценки, эти должны быть добавлены также динамически: allprojects {configurations.metaClass.addFlavorConfiguration {def configName="$ flavor.name $ {buildType.name.capitalize ()} Компилировать"; create (configName)}}}} –  Adreamus 21.11.2016 в 15:01
12

Добавьте задачу, которая зависит от каждой задачи и свойства assembleXxx после ее вызова

ext {
    currentConfig = ""
}
task generateConfigProperty(dependsOn: 'installDebug') {

    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->

            def taskName = "taskindicate$output.name"
            task "$taskName"() << {
                project.ext.set("currentConfig", "$output.name")
            }
            output.assemble.dependsOn "taskindicate$output.name"
        }
    }

}

task getConfig(dependsOn: ['installDebug', 'generateConfigProperty']) << {
    println("My config is $currentConfig")
}

взяла идею из ответа

    
ответ дан Alexander Blinov 12.12.2014 в 14:43
источник
  • +1 Обратите внимание, что если вы используете плагин com.android.library, applicationVariants не является доступным свойством. Вместо этого он становится библиотекой. stackoverflow.com/questions/28547203/... –  Alex T. 08.05.2017 в 11:32
5

Вы можете использовать

if(gradle.startParameter.taskNames.contains("assembleExample")) { // do stuff }

Эта переменная будет установлена ​​до того, как будет оценен блок buildConfig

    
ответ дан Shooky 29.11.2016 в 22:25
источник
  • вы должны взглянуть на все свои задачи для активной конфигурации, чтобы убедиться, что у вас есть правильное имя задачи, определенное, поскольку оно имеет несколько вариантов в зависимости от того, как настроен ваш проект. System.out.println (gradle.startParameter.taskNames) должен сделать трюк. Затем найдите эту задачу в приведенном выше примере Shooky. –  ShellDude 27.12.2017 в 17:58
4

Это довольно просто:

android {
    applicationVariants.all { variant ->
        variant.buildType.name // this is the value!
    }
}

Изменить: По-видимому, в какой-то момент с обновлением градации это не работает, как я упоминал в комментарии ниже. Поэтому я рекомендую проверить другие параметры.

    
ответ дан Reinherd 19.04.2016 в 15:59
источник
  • Этот цикл охватывает все доступные типы сборки. –  Tim Kranen 19.04.2016 в 20:46
  • @timkranen, если это так, по крайней мере последнее в цикле, является текущим. Например, если я запускаю assembleDebug, он возвращает «debug», если я запускаю assembleRelease, он возвращает Release, что делает эту работу для меня! –  Reinherd 20.04.2016 в 12:01
  • Я продолжаю получать имена BuildType в том же порядке –  Leonardo Acevedo 11.08.2016 в 18:49
  • Я получаю сообщение об ошибке: Следующие правила модели не могут применяться из-за несвязанных входов и / или объектов: android.applicationVariants.all {...} –  Igor Ganapolsky 23.09.2016 в 17:34
  • @Reinherd, почему последний является текущим? как насчет градации? он будет вызывать сборкуDebug и собиратьRelease. –  Sunnyday 17.03.2018 в 20:45
Показать остальные комментарии
0
// declare a custom task class so you can reuse it for the different
// variants
class MyTask extends DefaultTask {
     String mVariantName;
     public void setVariantName(String variant) {mVariantName = variant;}
     public String getVariantName() { return mVariantName; }
     @TaskAction
     void action(){
        // do stuff
     }
}

// put this after your 'android{}' block.
android.applicationVariants.all { variant ->
    def taskName = "myTask_$variant.name"
    task "$taskName"(type: MyTask) << {
        // you can setup this task to various info regarding
        // variant
        variantName = variant.name
    }
    variant.assemble.dependsOn (taskName)
}

См. Предварительная настройка для более детали того, что вы можете извлечь из переменной variant .

теперь вы правильно подключите свой MyTask к цепочке. Выполнение этого способа также должно чисто обрабатывать создание множества вкусов сразу, поскольку оно создает новый экземпляр MyTask для каждого варианта.

    
ответ дан what 23.06.2016 в 16:44
источник
0

Это самый простой способ получить нужный результат. Вы определяете глобальную переменную, затем обновляете ее для использования позже, когда это необходимо.

// query git for the SHA, Tag and commit count. Use these to automate versioning.
def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()
//def gitTag = 'git describe --tags'.execute([], project.rootDir).text.trim()
def gitCommitCount = 100 +
        Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"))

def versionMajor = 1
def versionMinor = 5
def versionPatch = 2
def versionBuild = 0 // bump for dogfood builds, public betas, etc.

def buildType // define here to update in loop

android {

    applicationVariants.all { variant ->
        buildType = variant.buildType.name // sets the current build type
    }

    defaultConfig {
        applicationId "com.example"
        minSdkVersion 19
        targetSdkVersion 25
        vectorDrawables.useSupportLibrary = true

        versionCode gitCommitCount
        versionName "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}"
        versionNameSuffix "-${buildType}-build-${buildTime}"

}
    
ответ дан Codeversed 16.03.2017 в 17:29
источник