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:
- Error al generar apk firmado
- Las firmas de división son inconsistentes con la ejecución predeterminada de estudio de Android
- ¿Es posible tener archivos de origen personalizados por variante de compilación en Android Gradle?
- ¿Qué causa errores de "expresión constante requerida" para los valores de R.id.xxx generados en las sentencias switch?
- Agregue la dependencia al productFlavor específico y buildType en gradle
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 .
- Android Studio Toma mucho tiempo para ejecutar la aplicación en un dispositivo real
- Android Studio: ¿Cómo excluir el módulo google-services en el sabor del producto?
- ¿Cómo se ajustan jvm args para la memoria dex en gradle?
- ¿Hay alguna forma de desactivar javadoc se bloquea en Android Studio con Maven plugin?
- Uso de Quasar Fibers en la aplicación para Android
- Android: No se pudo encontrar ni cargar la clase principal org.gradle.wrapper.GradleWrapperMain
- Android Studio - processDebugResources ha fallado
- No se pudo obtener el modelo de tipo 'IdeaProject' con la instalación de Gradle
@ 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" }