Cómo pasar un parámetro al código Java en la configuración de ejecución / depuración de Android Studio

Mi aplicación androide hace algunas peticiones http a mi servidor. Sin embargo, a veces estoy depurando el nuevo código de api que se ejecuta en mi máquina de desarrollo. Me gustaría ser capaz de pasar algo (como una variable de entorno) por lo que en mi código , si está presente que sería capaz de utilizar que como el nombre de host para las solicitudes de api desde el emulador de Android.

Así que estoy buscando una manera de pasar algo como:

API_SERVER=http://10.0.2.2/myapp/ 

Y en mi código lo usaría de alguna manera, por ejemplo:

 final static String API_SERVER_REAL = "http://example.com/"; final String apiServerOverride = System.getenv("API_SERVER"); final String API_SERVER = (null != apiServerOverride && !apiServerOverride.isEmpty() ? apiServerOverride : API_SERVER_REAL); 

Sugiero el uso de productFlavors . Cada sabor puede contener ajustes específicos del entorno. Simplemente tengo una clase llamada 'Medio ambiente' que contiene todas las public static final String que necesito y cada sabor del producto incluye una versión diferente de esta clase con los valores establecidos para el entorno.

Sé que este hilo es muy antiguo, pero en mi opinión ninguna de las respuestas proporcionadas realmente resuelve el problema. Los sabores son inadecuados para parametrizar su compilación con cosas como las URL de la API, e incluso peor para cosas como las claves API, etc.

En primer lugar, build.gradle que define los sabores es parte de la fuente del proyecto, por lo tanto, no debe contener dicha información con el fin de ser comprometido con seguridad en los sistemas de control de origen.

En segundo lugar, puede surgir la necesidad de probar diferentes sabores contra diferentes puntos finales / claves API. ¿Qué pasa si sólo quieres golpear a algún servidor de depuración http que acaba de crear para solucionar un error? ¿Crearías un sabor para eso? Probablemente no … Los sabores son buenos para cosas como "sabor libre" y "sabor superior".

Este problema se resuelve fácilmente usando el indicador gradles -P . Puede acceder a las propiedades gradle que se pasan de esta manera como variables regulares dentro de su gradle.build, y puede variar su comportamiento en consecuencia.

Si desea insertar esta bandera más en su aplicación, puede utilizar la solución de Scott que se publicó aquí, combinada con la bandera proporcionada.

El comando build probablemente se vería así:

 $ gradle build -Papiroot=http://www.example.com 

Y en su build.gradle se define la tarea writeValue esta manera:

 task writeValue(type:Exec) { commandLine '/usr/local/bin/adb', 'shell', "echo 'API_SERVER=${apiroot}' > /data/data/values.properties" } 

FYI el indicador -P se puede configurar fácilmente en Android Studio navegando desde el menú:

Run -> Run / Debug Configurations -> Defaults -> Gradle -> Parámetros de secuencia de comandos

Probablemente la cosa más simple es escribir los datos que desea pasar a un archivo en el dispositivo en / data / data; Su aplicación de Android puede leer el dispositivo trivialmente (tal vez lo convierten en un archivo .properties y utilice java.util.Properties para leerlo). Para escribirlo, utilice este tipo de tarea en su archivo build.gradle (y use la ruta correcta al comando adb para su configuración):

 task writeValue(type:Exec) { commandLine '/usr/local/bin/adb', 'shell', 'echo \'API_SERVER=http://10.0.2.2/myapp/\' > /data/data/values.properties' } 

Hay documentación sobre las tareas de exec de Gradle en http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html

Puede ejecutar esta tarea manualmente desde Android Studio mediante la vista de tareas de Gradle:

Pantalla de visualización de tareas de Gradle

Debido a un error en Android Studio, no puedes pasar parámetros de vm o de script desde una configuración gradle. El problema está aquí .

Como una solución en Linux envs (probablemente Mac también), puede crear una configuración bash donde podrá agregar todos los parámetros deseados.

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