Código de ruta por sabor en Android Gradle

Tengo 2 buildTypes (depuración, liberación) y 2 productFlavors (product1, product2). Quiero definir un buildConfigField para cada buildType y productFlavors. BuildConfigField es la url de la aplicación para descargar datos del servidor, y cambia para cada productFlavor y buildTypes.

Ahora tengo:

buildTypes { debug { debuggable true } release { debuggable false } } productFlavors { product1 { buildConfigField STRING, "URL_BASE", '"https://api1.release.com"' } product2 { buildConfigField STRING, "URL_BASE", '"https://api2.release.com"' } } 

Pero quiero algo como esto:

 buildTypes { debug { debuggable true } release { debuggable false } } productFlavors { product1 { debug { buildConfigField STRING, "URL_BASE", '"https://api1.debug.com"' } release { buildConfigField STRING, "URL_BASE", '"https://api1.release.com"' } product2 { debug { buildConfigField STRING, "URL_BASE", '"https://api2.debug.com"' } release { buildConfigField STRING, "URL_BASE", '"https://api2.release.com"' } } } 

¿Cómo puedo lograr esto?

Actualizar:

Cada URL_BASE tiene un patrón diferente, por lo que no puedo agrupar las URL. Una posible solución es agregar la base url del sabor 2 en los diferentes tipos de construcción y seleccionar la correcta en el sabor.

 buildTypes { debug { debuggable true buildConfigField STRING, API_VARIANT_PRODUCT1, '"api1.deb.com"' buildConfigField STRING, API_VARIANT_PRODUCT2, '"api2.debug.com"' } release { debuggable false buildConfigField STRING, API_VARIANT_PRODUCT1, '"api1.release.com"' buildConfigField STRING, API_VARIANT_PRODUCT2, '"api2.release.com"' } } productFlavors { product1 { buildConfigField STRING, URL_BASE, '"https://" + API_VARIANT_PRODUCT1 + "/v1"' } product2 { buildConfigField STRING, URL_BASE, '"https://" + API_VARIANT_PRODUCT2 + "/v1"' } } } 

ACTUALIZAR 2

Si necesitas agregar recursos en gradle, como un 'KEY_MAP' la solución está en esta página .

@ Beni, puedes usar algo como esto

 buildTypes { debug { debuggable true buildConfigField("String", "API_VARIANT", '"debugvariant"') } release { debuggable false buildConfigField("String", "API_VARIANT", '"releasevariant"') } } productFlavors { product1 { buildConfigField("String", "URL_BASE", '"https://api1." + API_VARIANT + ".com"') } product2 { buildConfigField("String", "URL_BASE", '"https://api2." + API_VARIANT + ".com"') } } 

El problema con lo que se proponía hacer es que la última definición de la buildConfigField STRING, "URL_BASE" valores para cada buildType se utilizará en todos los sabores del producto. Así que lo que acabaría con sería algo como "https://api2.release.com" en ambas versiones de lanzamiento.

Usando lo anterior, terminará con algo como esto en sus archivos BuildConfig para cada variante

 // Fields from build type: debug public static final String API_VARIANT = ["debugvariant"|"releasevariant"]; // Fields from product flavor: [product1|product2] public static final String URL_BASE = "https://[api1|api2]." + API_VARIANT + ".com"; 

Espero que esto ayude.

El tipo de construcción no forma parte del sabor del producto y viceversa. La variante se calcula en función del tipo de construcción y del sabor del producto. Usando esto solo puede crear una extensión (opción 1) o una propiedad (opción 2) con un formato consistente usando tanto el sabor del producto como el tipo de construcción.

Opción 1

 ext.product1_release_base_url = 'http://baseurl.myproduct/public' ext.product2_release_base_url = 'http://baseurl.yourproduct/secure' ext.product1_debug_base_url = 'http://debugurl.myproduct/test' ext.product2_debug_base_url = 'http://yourproduct/debug' android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled false } } productFlavors { product1 {} product2 {} } } project.android.applicationVariants.all {variant -> def url = project.ext."${variant.flavorName}_${variant.buildType.name}_base_url" variant.buildConfigField('String', 'URL_BASE', "\"${url}\"") } 

opcion 2

En gradle.properties

 product1_release_base_url = 'http://baseurl.myproduct/public' product2_release_base_url = 'http://baseurl.yourproduct/secure' product1_debug_base_url = 'http://debugurl.myproduct/test' product2_debug_base_url = 'http://yourproduct/debug' 

En build.gradle

 android { buildTypes { release {} debug {} } productFlavors { product1 {} product2 {} } } project.android.applicationVariants.all {variant -> def url = project."${variant.flavorName}_${variant.buildType.name}_base_url" variant.buildConfigField('String', 'URL_BASE', "\"${url}\"") } 

No sé cómo puede establecer valores diferentes para varios BuildVariants (build types + flavor) en build.gradle con el método buildConfigField .

Sin embargo, puede utilizar un valor diferente para su url_base dentro de res/values/strings.xml .

Algo como:

 <string name="url_base">https://api1.debug.com</string> 

A continuación, puede crear el mismo recurso de cadena en estas carpetas:

  - app/src/product1Debug: Contains product1-debug-related code/resources - app/src/product1Release: Contains product1-release-related code/resources - app/src/product2Debug: Contains product2-debug-related code/resources - app/src/product2Release: Contains product2-release-related code/resources 

Por supuesto, no es lo mismo tener un valor dentro de BuildConfig y es menos confortable que la configuración con build.gradle .

 applicationVariants.all { variant -> def apiVariant = variant.getFlavorName == "product1" ? "api1" : "api2" def server = variant.buildType.name == "debug" ? "debug" : "release" variant.buildConfigField STRING, URL_BASE, "http://" + apiVariant + "." + server + ".com" } 
  • Excluir .jar de compilar en Android Studio con Gradle
  • Rango de buildToolsVersion o '+' en gradle
  • Se encontró más de un archivo con la ruta independiente del sistema 'META-INF / LICENSE'
  • No se encuentra la dependencia de la biblioteca nativa de Android
  • ¿Cómo evitar que el estudio de Android use el camino absoluto?
  • ¿Cómo agregar ActiveManager ORM a Gradle?
  • Duplicar archivos copiados en APK Android - ¿Puede ser fusionado?
  • ¿Cómo empaquetar y vincular OpenCV binares y OpenCV Java SDK para Android Studio?
  • Eclipse libGDX no se puede ejecutar como aplicación Android
  • ¿Hay alguna forma de integrar Eclipse con Gradle en el proyecto de Android?
  • ¿Cómo incluir dependencias en el proyecto de gradol de la biblioteca android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.