BuildConfigField depending on taste + buildType

I am trying to define buildConfigVariable depending on the + buildType style. Ideally, this is what I want

productFlavors { strawberry { buildConfigField "String", "WS_API_KEY", name + variant.buildType.name } ... more flavors .. } 

name contains strawberries, but I don’t know if it is possible to access the buildType option.

Hosted outside of Android closure, I have access to BuildType and the option, but then I cannot call 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"] 

I can easily create a Java factory and return the corresponding API_KEY depending on some BuildConfig constants, but I would prefer to keep the code configuration agnostic.

+11
android android-gradle android-productflavors
Mar 19 '14 at 12:45
source share
2 answers

Edit2: version after 0.14.2 will allow this:

 applicationVariants.all { variant -> variant.buildConfigField "int", "VALUE", "1" } 

So you can do something like this (to fit the original question):

 applicationVariants.all { variant -> variant.buildConfigField "String", "WS_API_KEY", variant.productFlavors.get(0).name + '_' + variant.buildType.name } 

Edit: this is currently not possible. There is no API for this. Error: https://code.google.com/p/android/issues/detail?id=67416

Try the following:

 applicationVariants.all { variant -> variant.mergedFlavor.buildConfigField "String", "NAME", '"VALUE"' } 

Strike>

+12
Mar 19 '14 at 15:58
source share

Warning: this may be a fragile decision, use at your own risk. See https://code.google.com/p/android/issues/detail?id=67416

This is how I did what I wanted. You need to change the values ​​just before the task, so I need a way to bind my code.

 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("(?<!(^|[AZ]))(?=[AZ])|(?<!^)(?=[AZ][az])") 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) } } } 

To understand why this works, download the AOSP source code and check out VariantConfiguration.getBuildConfigItems ()

Using the Xavier response calls the MethodMissingError method. If I use variant.mergedFlavor.addBuildConfigField (), there is no error, but the variable is not added.

0
Mar 19 '14 at 16:40
source share



All Articles