11

我的 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);
4

4 回答 4

14

我知道这个线程已经很老了,但在我看来,所提供的答案都没有真正解决问题。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 -> 脚本参数

于 2015-04-23T22:25:45.747 回答
3

可能最简单的事情是将要传递的数据写入设备上的/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 手动执行此任务:

Gradle 任务视图的屏幕截图

于 2014-02-24T05:14:18.780 回答
1

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

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

于 2015-09-08T12:03:23.270 回答
0

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

于 2014-07-21T01:27:24.923 回答