tutorial studio productflavors now must flavors flavordimensions flavor configurar belong all android gradle android-gradle build.gradle

studio - flavordimensions android



Ruta del código por sabor en Android Gradle (4)

No sé cómo puede establecer diferentes valores para múltiples BuildVariants (tipos de construcción + sabor) en build.gradle con el método buildConfigField .

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

Algo como:

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

Luego 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 cómodo que la configuración con build.gradle .

Tengo 2 buildTypes (depuración, versión) y 2 productFlavors (product1, product2). Quiero definir buildConfigField para cada buildType y productFlavors. BuildConfigField es la URL de la aplicación para descargar datos del servidor y cambia para cada productoFlavor 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 2 sabor en los diferentes tipos de compilació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"'' } } }

ACTUALIZACIÓN 2

Si necesita 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 buildConfigField STRING, "URL_BASE" hacer es que la última definición de buildConfigField STRING, "URL_BASE" valores para cada buildType se utilizará en todos los sabores de productos. Entonces, lo que terminaría sería algo así como "https://api2.release.com" en ambas versiones de lanzamiento.

Usando lo anterior, terminarás con algo como esto en tus 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.


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


Build Type no es parte de Product Flavor y viceversa. La variante se calcula según el tipo de construcción y el sabor del producto. Al usar esto, puede simplemente crear una extensión (opción 1) o una propiedad (opción 2) con un formato consistente utilizando tanto el sabor del producto como el tipo de compilació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}/"") }