Как получить текущий 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 публикуются.
Ответы
Ответ 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}"
}