Как передать параметр в код Java в конфигурации запуска / отладки из Android Studio

Мое приложение для Android делает некоторые HTTP-запросы на моем сервере. Однако иногда я отлаживаю новый код api, который запускается на моей машине разработки. Я хотел бы иметь возможность передать что-то (например, переменную среды), поэтому в моем коде , если он присутствует, я мог бы использовать это как имя хоста для запросов api от эмулятора android.

Поэтому я ищу способ передать что-то вроде:

API_SERVER=http://10.0.2.2/myapp/ 

И в моем коде я бы использовал его как-то, например:

 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); 

Solutions Collecting From Web of "Как передать параметр в код Java в конфигурации запуска / отладки из Android Studio"

Я предлагаю использовать productFlavors . Каждый аромат может содержать настройки, специфичные для окружающей среды. У меня просто есть класс под названием «Среда», который содержит все public static final String которые мне нужны, и каждый вкус продукта включает в себя другую версию этого класса со значениями, установленными для среды.

Я знаю, что эта ветка довольно старая, но, на мой взгляд, ни один из предоставленных ответов не решает проблему. Ароматизаторы не подходят для параметризации вашей сборки такими вещами, как URL-адреса API, и даже хуже для таких вещей, как ключи API и т. Д.

Во-первых, build.gradle который определяет ароматы, является частью источника проекта, поэтому он не должен содержать такую ​​информацию, чтобы быть безопасно переданной в системы управления версиями.

Во-вторых, может возникнуть необходимость протестировать различные вкусы в отношении разных конечных точек / ключей API. Что делать, если вы просто хотите поразить какой-то отладочный HTTP-сервер, который вы только что создали, чтобы решить проблему? Вы бы создали для этого вкус? Наверное, нет … Ароматизаторы хороши для таких вещей, как «свободный вкус» и «премиальный вкус».

Эту проблему легко решить с помощью градиента -P . Вы можете получить доступ к свойствам градиента, которые передаются таким образом в виде регулярных переменных внутри вашего gradle.build, и вы можете соответствующим образом изменять его поведение.

Если вы хотите нажать эти флаги дальше в свое приложение, вы можете использовать решение Скотта, которое было опубликовано здесь, в сочетании с предоставленным флагом.

Тогда команда сборки будет выглядеть так:

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

И в вашем build.gradle вы определяете задачу writeValue следующим образом:

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

FYI флаг -P можно легко настроить в Android Studio, перейдя в меню:

Run -> Run / Debug Configurations -> Defaults -> Gradle -> Параметры скрипта

Вероятно, самое простое – записать данные, которые вы хотите передать файлу на устройстве в / data / data; Ваше приложение Android может читать устройство тривиально (возможно, сделайте его файлом .properties и используйте java.util.Properties чтобы его прочитать). Чтобы записать это, используйте эту задачу в файле build.gradle (и используйте правильный путь к команде adb для вашей установки):

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

Имеется документация по задачам Gradle exec по адресу http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html.

Вы можете выполнить эту задачу вручную из Android Studio с помощью представления задач Gradle:

Снимок экрана с представлением задач «Грейдл»

Из-за ошибки в Android Studio вы не можете передавать параметры vm или скрипта из конфигурации градиента. Проблема здесь .

Как обходной путь в Linux envs (возможно, Mac тоже), вы можете создать конфигурацию bash, где вы сможете добавить все нужные параметры.