Comment passer un paramètre au code Java dans la configuration d'exécution / débogage à partir d'Android Studio
Mon application android n'certaines requêtes http sur mon serveur. Cependant, parfois, je suis le débogage de la nouvelle api de code qui s'exécute sur ma machine de développement. Je voudrais être en mesure de passer à quelque chose (comme une variable d'environnement), donc dans mon codesi elle est présente, je serais en mesure de l'utiliser comme le nom d'hôte pour les requêtes à l'api de l'émulateur android.
Donc je suis à la recherche d'un moyen de transmettre quelque chose comme:
API_SERVER=http://10.0.2.2/myapp/
et dans mon code je voudrais l'utiliser d'une certaine façon, par exemple:
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);
source d'informationauteur Gavriel | 2014-02-23
Vous devez vous connecter pour publier un commentaire.
Je suggère d'utiliser productFlavors. Chaque arôme peut contenir des paramètres spécifiques à l'environnement. J'ai simplement une classe appelée "Environnement", qui contient tous les
public static final String
s que j'ai besoin et chaque produit de la saveur comprend une version différente de cette classe avec les valeurs définies pour l'environnement.Je sais que ce fil est assez ancien, mais à mon avis, aucune des réponses résout effectivement le problème. Les saveurs sont mal adaptés pour le paramétrage de votre build avec des choses comme Url de l'API, et encore pire pour des choses comme des clés API etc.
Tout d'abord,
build.gradle
qui définit les saveurs est une partie de la source du projet, donc il ne doit pas contenir de telles informations afin d'être commis en toute sécurité dans les systèmes de contrôle de source.Deuxièmement, il peut s'avérer nécessaire de tester les différentes saveurs contre les différentes API des points de terminaison/clés. Que faire si vous voulez juste de frapper certains de débogage du serveur http que vous venez de créer pour résoudre un bug? Voulez-vous créer une saveur pour qui? Probablement pas... les Saveurs sont bonnes pour des choses comme "libre saveur" et "premium de la saveur".
Ce problème est facilement résolu en utilisant gradles
-P
drapeau. Vous pouvez accéder à gradle propriétés qui sont transmis de cette manière que les variables à l'intérieur de votre gradle.construire, et vous pouvez la modifier son comportement en conséquence.Si vous voulez pousser ce drapeaux plus loin dans votre application, vous pouvez utiliser Scott solution qui a été posté ici, combiné avec le drapeau.
De la commande build serait alors probablement ressembler à:
Et dans votre
build.gradle
vous définiriez lawriteValue
tâche comme ceci:Pour info l'option-P peut être facilement configuré en Android Studio en naviguant depuis le menu:
Exécuter -> Run/Debug Configurations -> valeurs par Défaut -> Gradle -> Paramètres de Script
Probablement la chose la plus simple est d'écrire les données que vous souhaitez passer à un fichier sur le périphérique dans /data/data; votre application Android peut lire l'appareil trivialement (peut-être en faire un .fichier de propriétés et l'utilisation
java.util.Properties
pour le lire). Pour l'écrire, l'utilisation de ce type de tâche dans votre construire.gradle fichier (et utiliser le chemin d'accès correct à la bad de commande pour votre installation):Il y a de la documentation sur Gradle exec tâches à http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html
Vous pouvez exécuter cette tâche manuellement à partir d'Android Studio à l'aide de la Gradle vue tâches:
En raison d'un bogue dans Android Studio, vous ne pouvez pas passer vm ou des paramètres de script à partir d'un gradle de configuration. La question est ici.
Comme une solution de contournement dans Linux envs (probablement Mac aussi), vous pouvez créer un bash de configuration où vous serez en mesure d'ajouter tous les paramètres désirés.