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