buildConfigField en fonction de la saveur + buildType
j'essaie de définir un buildConfigVariable selon le goût+ buildType. Idéalement, c'est ce que je veux
productFlavors {
strawberry {
buildConfigField "String", "WS_API_KEY", name + variant.buildType.name
}
... more flavors ..
}
nom contient "strawberry", mais je ne sais pas s'il est possible d'accéder au variantebuildType.
placé à l'extérieur du Android fermeture j'ai accès à l' BuildType et variante, mais alors je ne peux pas appeler 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"]
je peux facilement créer une usine Java et retourner leAPI_KEY
selon certains BuildConfig
constantes, mais je préfère garder la configuration du code agnostique.
2 réponses
Edit2: La version après 0.14.2 permettra de faire ceci:
applicationVariants.all { variant ->
variant.buildConfigField "int", "VALUE", "1"
}
alors vous pourriez faire quelque chose comme ceci (pour correspondre à la question originale):
applicationVariants.all { variant ->
variant.buildConfigField "String", "WS_API_KEY", variant.productFlavors.get(0).name + '_' + variant.buildType.name
}
Edit: ce n'est pas possible actuellement. L'API est manquante pour cela.
Bug:https://code.google.com/p/android/issues/detail?id=67416
essaye ceci:
applicationVariants.all { variant ->
variant.mergedFlavor.buildConfigField "String", "NAME", '"VALUE"'
}
https://code.google.com/p/android/issues/detail?id=67416
Voici comment j'ai accompli ce que je voulais. Vous devez changer les valeurs juste avant que la tâche ne soit exécutée, donc j'avais besoin d'un moyen d'accrocher mon code là-dedans.
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)
}
}
}
pour comprendre pourquoi cela fonctionne, Téléchargez le code source de L'AOSP et vérifiez VariantConfiguration.getBuildConfigItems ()
L'utilisation de la réponse de Xavier jette une erreur de méthode. Si j'utilise variante.mergedFlavor.addBuildConfigField () il n'y a pas d'erreur, mais la variable n'est pas ajouté.