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

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

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

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

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

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

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

4b9b3361

Ответ 1

Я не смог найти чистый способ получить текущий тип сборки во время фазы конфигурации 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')

Если вы также используете компоновку сборки, вам придется адаптировать решение. См. Эту ссылку для документации по этой функции: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication

Обратите внимание, что команда Android работает над улучшением этого поведения: https://code.google.com/p/android/issues/detail?id=52962

Ответ 2

Добавьте задачу, которая зависит от каждой задачи и свойства 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")
}

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

// 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 для каждого варианта.

Ответ 6

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

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

}