【问题标题】:How to pass a parameter to the Java code in run/debug configuration from Android Studio如何在 Android Studio 的运行/调试配置中将参数传递给 Java 代码
【发布时间】:2014-02-23 18:29:49
【问题描述】:

我的 android 应用程序向我的服务器发出一些 http 请求。但是有时我正在调试在我的开发机器上运行的新 api 代码。我希望能够传递一些东西(比如环境变量),所以在我的代码中,如果它存在,我可以将它用作来自 android 模拟器的 api 请求的主机名。

所以我正在寻找一种方法来传递类似的东西:

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

【问题讨论】:

  • 问题是如何设置运行配置以使 Android Studio 轻松实现这一点?我建议使用命令行参数而不是环境变量。
  • 我也对此持开放态度。如何将命令行参数从 Android Studio 传递到在模拟器中运行的 Android 应用程序?哪个类在您的 android 应用程序中获取它?不知道有没有可能:stackoverflow.com/questions/20197242/…
  • 哦,我以为您在谈论将信息传递给服务器进程。 Android APK 没有命令行;您可以通过 adb shell 命令将值写入 Sqlite,或者只是将文件写入本地文件系统。
  • @RostyslavRoshak 这个问题是 2014 年的,另一个是 2015 年的,那么这怎么可能是另一个的重复?另外另一个问题是关于如何向 GRADLE 传递一些东西,而这个问题是如何向 APP 的 JAVA 代码传递一些东西

标签: android android-studio environment-variables run-configuration


【解决方案1】:

我知道这个帖子已经很老了,但在我看来,所提供的答案都没有真正解决问题。 Flavor 不适合使用 API URL 等参数化构建,更糟糕的是 API 密钥等。

首先,定义风味的build.gradle 是项目源代码的一部分,因此它不能包含此类信息,以便安全地提交到源代码控制系统中。

其次,可能需要针对不同的 API 端点/密钥测试不同的风格。如果您只想访问刚刚创建的用于解决错误的调试 http 服务器怎么办?你会为此创造一种味道吗?可能不是……口味适合“免费口味”和“高级口味”之类的东西。

使用 gradles -P 标志很容易解决这个问题。您可以在 gradle.build 中访问以这种方式作为常规变量传递的 gradle 属性,并且可以相应地改变它的行为。

如果您想将此标志进一步推送到您的应用程序中,您可以使用 Scott 在此处发布的解决方案,并结合提供的标志。

构建命令可能如下所示:

$ 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"
}

仅供参考,可以通过从菜单导航在 Android Studio 中轻松配置 -P 标志:

运行 -> 运行/调试配置 -> 默认值 -> Gradle -> 脚本参数

【讨论】:

  • 我喜欢这种方法,但它缺少一件小事:如何让 Android Studio Gradle 插件在将项目同步到 Android Studio 时传递该 -P 变量?你知道这是否可能吗?
【解决方案2】:

可能最简单的事情就是将要传递的数据写入设备上的文件/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'
}

http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html 有关于 Gradle 执行任务的文档

您可以使用 Gradle 任务视图从 Android Studio 手动执行此任务:

【讨论】:

  • 是否可以将任务挂接到其他默认的“android 构建系统”任务中,以便在您点击“运行”按钮后自动执行?
【解决方案3】:

由于 Android Studio 中的错误,您无法从 gradle 配置中传递 vm 或脚本参数。问题是here

作为 Linux 环境(也可能是 Mac)中的一种解决方法,您可以创建一个 bash 配置,您可以在其中添加所有需要的参数。

【讨论】:

    【解决方案4】:

    我建议使用productFlavors。每种风味都可以包含特定于环境的设置。我只是有一个名为“Environment”的类,其中包含我需要的所有public static final Strings,并且每种产品风格都包含该类的不同版本以及为环境设置的值。

    【讨论】:

    • 您链接的文档实际上已经过时并且现在已弃用。在这个用例中,buildTypes 构造比 productFlavors 更适合使用。不同之处在here 上进行了讨论,而当前文档在here 上进行了讨论。
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多