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.

13
demandé sur JJD 2014-03-19 16:45:58

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

13
répondu Xavier Ducrohet 2014-11-16 06:40:34

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é.

0
répondu Maragues 2014-03-24 15:34:49