Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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:

  • ¿Por qué no puedo usar la tarea gradle connectedDebugAndroidTest en mi script de compilación?
  • Utilizar el complemento Android DataBinding en paralelo con Google Plugin de servicios
  • No se puede encontrar la clase de símbolo en Android Studio
  • Conflicto con dependencia 'com.android.support:support-annotations'. Las versiones resueltas para la aplicación (23.1.0) y la aplicación de prueba (23.0.1) difieren
  • Generando sin firmar, libera apk con Android Studio
  • Android Studio no funciona bien con gradle 2.10 y gradle plugin 2.0.0-alpha5
  • 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 .

  • Color de texto de una ruleta cerrada
  • Android Studio no se puede iniciar después de la instalación
  • Cómo modificar el nombre de versión en Manifiesto durante la generación?
  • Estadísticas de las aplicaciones de Android en los usuarios de la red de los sitios de Android
  • Desactivar el resaltado del contorno naranja en el enfoque
  • Añadiendo imagen a Toast?
  • 4 Solutions collect form web for “Código de ruta por sabor en Android 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" } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.