BuildConfigField je nach Geschmack + buildType

Ich versuche, ein buildConfigVariable abhängig vom Geschmack + buildType zu definieren. Im Idealfall ist das, was ich will

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

Name enthält "Erdbeere", aber ich weiß nicht, ob es möglich ist, auf den BuildType der Variante zuzugreifen .

  • Retrofit2 Handle-Bedingung, wenn Statuscode 200 aber json Struktur anders als datamodel Klasse ist
  • Fehler beim Laden von libGL.so auf Android
  • Füge google-services.json in android studio hinzu
  • Wie kann ich eine String-Nummer formatieren, um Kommas im android Edit Field zu haben
  • Wie kann man listFooter nicht anklicken
  • Android Adjustpan funktioniert nach dem ersten Mal nicht
  • Platziert außerhalb der Android Schließung habe ich Zugriff auf die BuildType und Variante , aber dann kann ich nicht auf buildConfigField aufrufen

     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"] 

    Ich kann ganz einfach eine Java-Fabrik erstellen und die entsprechende API_KEY je nach einigen BuildConfig Konstanten zurückgeben, aber ich würde lieber die Code-Konfiguration agnostisch halten.

  • Android openGL ES glDrawArrays oder glDrawElements?
  • Wie man ein Button-Steuerelement zu einer Android-XML-Ansicht zur Laufzeit hinzufügen?
  • Wie kann ich Android Support Repository zu Android Studio hinzufügen?
  • Erstellen Sie Fehler mit neuen kotlin 1.1, kapt cant parse databinding params
  • Wie man getfilter () mit benutzerdefiniertem Adapter implementiert, der baseadapter erweitert
  • Wie kann man den TimePicker kleiner machen?
  • 2 Solutions collect form web for “BuildConfigField je nach Geschmack + buildType”

    Edit2: Die Version nach 0.14.2 wird dies tun:

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

    So könntest du so etwas machen (um die ursprüngliche Frage zu erfüllen):

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

    Edit: Es ist derzeit nicht möglich. Die API fehlt dafür. Bug: https://code.google.com/p/android/issues/detail?id=67416

    Versuche dies:

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

    Warnung: Das könnte eine zerbrechliche Lösung sein, auf eigene Gefahr verwenden. Weitere Informationen finden Sie unter https://code.google.com/p/android/issues/detail?id=67416

    So habe ich das erreicht, was ich wollte. Sie müssen die Werte ändern, kurz bevor die Aufgabe ausgeführt wird, also brauchte ich einen Weg, um meinen Code dort zu haken.

     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) } } } 

    Um zu verstehen, warum dies funktioniert, laden Sie den AOSP-Quellcode herunter und überprüfen Sie VariantConfiguration.getBuildConfigItems ()

    Die Verwendung von Xaviers Antwort wirft einen MethodMissingError. Wenn ich varant.mergedFlavor.addBuildConfigField () verwende, gibt es keinen Fehler, aber die Variable wird nicht hinzugefügt.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.