BuildConfigField в зависимости от вкуса + buildType
Я пытаюсь определить buildConfigVariable в зависимости от стиля + buildType. В идеале, это то, что я хочу
productFlavors {
strawberry {
buildConfigField "String", "WS_API_KEY", name + variant.buildType.name
}
... more flavors ..
}
name содержит "клубнику", но я не знаю, можно ли получить доступ к варианту buildType.
Размещенный вне закрытия Android у меня есть доступ к BuildType и варианту, но тогда я не могу вызывать buildConfigField
android.applicationVariants.all { variant ->
println "****************************"
println "variant: ${variant.name}"
println "flavor: ${variant.flavorName}"
println "****************************"
if (variant.buildType.name == 'release') {
if (variant.flavorName == 'strawberry') {
buildConfigField "String", "WS_API_KEY", '"strawberry_release"'
} else {
buildConfigField "String", "WS_API_KEY", '"chocolate_release"'
}
} else if(variant.buildType.name == 'debug') {
if (variant.flavorName == 'strawberry') {
buildConfigField "String", "WS_API_KEY", '"strawberry_debug"'
} else {
buildConfigField "String", "WS_API_KEY", '"chocolate_debug"'
}
}
****************************
variant: strawberryRelease
flavor: strawberry
****************************
org.gradle.api.internal.MissingMethodException:
Could not find method buildConfigField()
for arguments [String, WS_API_KEY, "strawberry_release"]
Я могу легко создать Java factory и вернуть соответствующий API_KEY
в зависимости от некоторых констант BuildConfig
, но я бы предпочел сохранить агностик конфигурации кода.
Ответы
Ответ 1
Edit2: версия после 0.14.2 позволит это сделать:
applicationVariants.all { variant ->
variant.buildConfigField "int", "VALUE", "1"
}
Итак, вы сможете сделать что-то вроде этого (чтобы соответствовать исходному вопросу):
applicationVariants.all { variant ->
variant.buildConfigField "String", "WS_API_KEY", variant.productFlavors.get(0).name + '_' + variant.buildType.name
}
Изменить: в настоящее время это невозможно. Для этого API отсутствует.
Ошибка: https://code.google.com/p/android/issues/detail?id=67416
Попробуйте следующее:
applicationVariants.all { variant ->
variant.mergedFlavor.buildConfigField "String", "NAME", '"VALUE"'
}
Забастовкa >
Ответ 2
Предупреждение: это может быть хрупкое решение, использовать на свой страх и риск. См. https://code.google.com/p/android/issues/detail?id=67416
Вот как я сделал то, что хотел. Вам нужно изменить значения непосредственно перед выполнением задачи, поэтому мне нужен способ привязать мой код.
final projectName = project.name
gradle.taskGraph.beforeTask { Task task ->
if (task.path ==~ /:$projectName:generate.*BuildConfig/) {
//extracts flavor and buildType name. See http://stackoverflow.com/a/7594052/218473 for regex
final values = task.name.replace("generate","").replace("BuildConfig","").split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")
final flavorName = values[0].toLowerCase()
final buildTypeName = values[1].toLowerCase()
com.android.build.gradle.api.ApplicationVariant variant;
android.applicationVariants.all { currentVariant ->
if (currentVariant.getVariantData().getVariantConfiguration().getBuildType().getName() == buildTypeName) {
if (currentVariant.getVariantData().getVariantConfiguration().getFlavorName() == flavorName) {
variant = currentVariant;
}
}
}
if(variant != null) {
com.android.builder.internal.ClassFieldImpl apiKeyField
if (flavorName == 'strawberry') {
if (buildTypeName == 'release') {
apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"strawberry_release"')
} else {
apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"strawberry_debug"')
}
} else if (flavorName == 'chocolate') {
if (buildTypeName == 'release') {
apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"chocolate_release"')
} else {
apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"chocolate_debug"')
}
}
variant.getVariantData().getVariantConfiguration().getFlavorConfigs().get(0).addBuildConfigField(apiKeyField)
}
}
}
Чтобы понять, почему это работает, загрузите исходный код AOSP и проверьте VariantConfiguration.getBuildConfigItems()
Использование ответа Xavier вызывает метод MethodMissingError. Если я использую variant.mergedFlavor.addBuildConfigField(), нет ошибки, но переменная не добавляется.