Как передать параметр в код 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);

person Gavriel    schedule 23.02.2014    source источник
comment
И вопрос в том, как настроить конфигурацию запуска, чтобы сделать это легко из Android Studio? Вместо переменной среды я бы предложил параметр командной строки.   -  person Scott Barta    schedule 23.02.2014
comment
Я тоже открыт для этого. Как вы передаете параметр командной строки из Android Studio в ваше Android-приложение, работающее в эмуляторе? Какой класс получает это в вашем приложении для Android? Интересно, возможно ли это: stackoverflow.com/ вопросы/20197242/   -  person Gavriel    schedule 23.02.2014
comment
О, я думал, вы говорите о передаче информации серверному процессу. Для Android APK нет командной строки; вы можете записать значение в Sqlite с помощью команд оболочки adb или, может быть, просто записать файл в локальную файловую систему.   -  person Scott Barta    schedule 24.02.2014
comment
Возможный дубликат Передача параметров -P в gradle из студии Android   -  person Rostyslav Roshak    schedule 04.08.2017
comment
@RostyslavRoshak этот вопрос от 2014 года, другой от 2015 года, так как это может быть дубликатом другого? Также другой вопрос заключается в том, как передать что-то в GRADLE, а этот вопрос заключается в том, как передать что-то в код JAVA приложения.   -  person Gavriel    schedule 06.08.2017


Ответы (4)


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

person Nebu    schedule 21.07.2014
comment
Документ, на который вы ссылаетесь, на самом деле устарел и устарел. В этом случае конструкция buildTypes является более подходит для использования, чем productFlavors. Разница обсуждается здесь, а текущая документация по обоим < href="https://developer.android.com/studio/build/build-variants.html" rel="nofollow noreferrer">здесь. - person ScottyC; 13.02.2018

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

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

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

Эта проблема легко решается с помощью флага -P gradles. Вы можете получить доступ к свойствам gradle, которые передаются таким образом как обычные переменные внутри вашего 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"
}

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

Выполнить -> Конфигурации запуска/отладки -> По умолчанию -> Gradle -> Параметры скрипта

person Karol Majta    schedule 23.04.2015
comment
Мне нравится этот подход, но в нем отсутствует одна крошечная вещь: как заставить подключаемый модуль Android Studio Gradle передавать эту переменную -P при синхронизации проекта с Android Studio? Вы знаете, возможно ли это вообще? - person Julian Cerruti; 09.11.2015

Вероятно, самое простое — записать данные, которые вы хотите передать, в файл на устройстве в /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:

Снимок экрана просмотра задач Gradle

person Scott Barta    schedule 24.02.2014
comment
Разве нельзя подключить задачу к какой-либо другой системной задаче сборки Android по умолчанию, чтобы она выполнялась автоматически, как только вы нажмете кнопку «Выполнить»? - person dirleyrls; 10.01.2015

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

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

person user2468170    schedule 08.09.2015