¿Cómo gestionas múltiples entornos mientras desarrollas aplicaciones Android?

Estamos creando una aplicación de Android que se conecta a la nube. Tenemos una URL de prueba para nuestras API y una URL de producción. Conectamos la aplicación a nuestras máquinas de desarrollo local para hablar con la base de datos al desarrollar pero nos encontramos modificando una URL de API global a la URL de producción cada vez que generamos un APk para Play Store.

¿Existe una mejor manera de gestionar los entornos para Android? ¿Podemos tener también dos versiones de la aplicación (versión de desarrollo) y la versión de Play Store? No puedo tener dos versiones ya que ambas aplicaciones tienen la misma firma. ¿Cómo manejamos mejor esto?

Con androide estudio y gradle su simple ahora.

Dentro de su aplicación build.gradle edit signature configs

signingConfigs { debug { storeFile file("debug.keystore") storePassword "..." keyAlias "..." keyPassword "..." } prod { storeFile file("prod.keystore") storePassword "..." keyAlias "..." keyPassword "..." } dev { storeFile file("dev.keystore") storePassword "..." keyAlias "..." keyPassword "..." } } 

Add buildTypes

 buildTypes { debug { buildConfigField 'String', 'BASE_URL', '"http://127.0.0.1:8080/"' ...... signingConfig signingConfigs.debug } prod { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField 'String', 'BASE_URL', '"http://prod.example.com"' ...... signingConfig signingConfigs.prod } dev { buildConfigField 'String', 'BASE_URL', '"http://dev.example.com"' ...... signingConfig signingConfigs.dev } } 

En su código tome la URL de base configurada en el archivo gradle por este código.

 public final static String BASE_URL = BuildConfig.BASE_URL; 

Usted puede también poner la LLAVE diferente o lo que es tipo específico de la estructura en archivo del gradle y en código que tomará según el tipo de la estructura que usted está funcionando.

Incluso es posible tener nombre de paquete diferente.

 productFlavors { my_prod { applicationId "com.example.packtwo" } my_dev { applicationId "com.example.packone" } } 

Busque más posibilidades …

Pero si usted está utilizando sabores diferentes que usted puede ser que tenga que ocuparse de la fusión de manifiesto y todo.

Utilice Ant para crear al menos las versiones de producción. De esta manera puede establecer ciertos valores de configuración / indicadores durante la construcción. Supongamos que tiene un archivo config.xml que contiene la dirección URL del servidor. Puede tener diferentes objetivos de creación de hormigas que cambien la dirección URL para que apunte al servidor apropiado. Echa un vistazo a este tutorial. Explica exactamente cómo se hace.

Esto creo que se considera como la práctica libra en caso de que utilice el estudio androide con gradle.

Puede que desee ver este artículo: http://tulipemoutarde.be/2013/10/06/gradle-build-variants-for-your-android-project.html

También disponible en el video de youtube: https://www.youtube.com/watch?v=7JDEK4wkN5I

Esto también le permite tener dos nombres de paquetes diferentes para la misma aplicación.

Utiliza los sabores gradle para lograr exactamente lo que está buscando y es muy fácil de implementar.

Esto se puede lograr utilizando sabores de productos.

Para lograr este requisito:

En primer lugar, crear 2 archivos en la carpeta de la aplicación de su proyecto decir development.props y production.props . O puede agregar estos 2 archivos en un paquete en la carpeta de la aplicación dice config.

Introduzca aquí la descripción de la imagen

Básicamente, estos 2 archivos contienen claves y valores. Esta clave es la misma para ambos archivos. Pero sus valores son diferentes. Estos archivos contienen una clave que dice "SERVER_URL" y su valor. Se escribiría así:

SERVER_URL = "Server_url_value"

En este caso, sólo la URL es diferente. Por lo tanto, he añadido sólo un par clave-valor en el archivo Props. Puede agregar más.

A continuación, cree ProductFlavours en el archivo build.gradle de la aplicación, diga desarrollo y producción. Ahora, acceda a diferentes archivos de accesorios que contengan URL en sus correspondientes sabores como este:

 productFlavors { development { getProps('./config/development.props').each { p -> buildConfigField 'String', p.key, p.value } } production { getProps('./config/production.props').each { p -> buildConfigField 'String', p.key, p.value } } } def getProps(path) { Properties props = new Properties() props.load(new FileInputStream(file(path))) return props } 

Ahora, para cada sabor, hay un tipo de construcción y este BuildType se agrega en la aplicación build.gradle. Por ejemplo, el tipo de construcción es Debug y release . Y tengo dos sabores, es decir, el desarrollo y la producción. Por lo tanto, la tarea de gradle se creará utilizando tanto sabor y tipo de construcción como este:

 assemble{flavourName}{BuildType} 

Ahora, sólo tiene que escribir estos comandos. Generaría APK requerido con su URL correspondiente. Los comandos son:

./gradlew assembleProductionRelease generaría generación de liberación con URL de producción.

./gradlew assembleDevelopmentDebug generaría generación de depuración con URL de desarrollo.

./gradlew assembleProductionDebug generaría una compilación de depuración con URL de producción.

./gradlew assembleDevelopmentRelease generaría generación de release con URL de desarrollo.

La tarea de los tres primeros grados sería muy útil. Sin embargo, la última tarea generaría generación de versión con URL de desarrollo. Pero esto no es recomendable. Por lo tanto, debemos detener desarrollador para ejecutar esta tarea es decir ./gradlew assembleDevelopmentRelease

Ahora Para restringir el desarrollador para generar la generación de la versión con la URL de desarrollo, añada este fragmento en su archivo build.gradle de la aplicación:

 android.variantFilter { variant -> if(variant.buildType.name.equals('release') && variant.getFlavors().get(0).name.equals('development')) { variant.setIgnore(true); } } 

Ahora, si intentamos ejecutar la tarea ie ./gradlew DevelopmentRelease . Gradle dejaría de generar la excepción build y throw y diría: Esta tarea assembleDevelopmentRelease no se encuentra en el proyecto raíz.

No sé cuál es la mejor práctica en ese caso, pero me gusta esto:

Puedes hacer que tu aplicación sea LIB y crear 2 aplicaciones: aplicación de producción y aplicación de prueba. Importe su biblioteca para esas aplicaciones y construya sus manifiestos (es casi copia de la pasta de la antigua). A continuación, reemplazar los archivos / res / que son diferentes en cada aplicación … (podría crear un archivo config.xml que tienen la dirección URL).

Puede probar gradle buildType y productFlavor . Le permitirá especificar diferentes variables de entorno como url, versionName, etc y applicationId que le permitirá tener dev y prod construye. Para más detalles http://developer.android.com/tools/building/configuring-gradle.html

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.