0

我想设置一个变量SERVER_URL,它将在productiontestdevelopment环境之间切换。

我想做的事:

@Override
protected void onCreate(Bundle bundle) {
    R.urls.SERVER_URL; // is it a valid approach using resources?
}

有没有办法在不更改代码的情况下切换环境(开发、产品、测试)?

实现此行为的最佳方法是什么?

有没有办法在我的变量(SERVER_URL)的playstore中配置它,或者我必须只在代码中实现?

4

3 回答 3

1

有两种方法可以做到:

1/ 按string你想要的资源

添加一个名为secret_keys.xml或任何名称的资源文件以将其与其他资源文件分开。translatable="false"将您的密钥、api 端点作为普通字符串资源放在这里,如果您不想弄乱本地化,请记住添加。

将该文件放在app/debug/res/values/. debug如果不存在,则创建一个新文件夹。staging对or执行相同release操作,Android 将自动使用与构建类型同名的文件夹。

2/ 按properties文件

创建 3 个 .properties 文件并将密钥放入其中: 在此处输入图像描述

HOST="http://api.blablabla.com"
CLIENT_ID="hahaha"
CLIENT_SECRET="hehehe"

将其绑定到BuildConfig应用程序中的变量,build.gradle对其他构建类型执行相同操作:

def getPropertiesFile = { path ->
    Properties properties = new Properties()
    properties.load(new FileInputStream(file(path)))
    return properties
}

android {
    ...

    buildTypes {
        debug {
            ...

            getPropertiesFile('./config/development.properties').each { p ->
                buildConfigField 'String', p.key, p.value
            }
        }
        ...
    }
}

在您的应用程序中,只需调用BuildConfig.HOST即可获取您想要的字符串

更新

忽略这些配置文件.gitignore

app/config
secret_keys.xml
于 2018-05-09T15:05:12.590 回答
0

你不能那样做。

通常,您会设置一个固定的后端 Web 服务,该服务返回您的 SERVER_URL,您将在启动时从应用程序中使用 API。

于 2018-05-09T14:41:16.903 回答
0

您可以使用不同的方法。理想情况下,您不应在运行时更改 URL 以最小化攻击面。这种方法可能会对您的应用程序的安全性产生直接影响。

如果您的目标是在不接触代码的情况下修改此 URL,您可以在编译时绑定此值。您可以application.properties为不同的目标构建(开发、生产、测试​​)创建文件并修改此文件。在您的代码中,您可以从属性文件中读取值,而不是硬编码值。您可以将此文件放在您的assets文件夹中并应用必要的混淆。这样,只有属性文件会更改,并且您的应用程序的安全性保持不变。

另一种方法是在构建时(执行gradlew命令时)提供此参数。您可以添加将添加到BuildConfig. 在您的代码中,您可以通过调用 BuildConfig.SERVER_URL 来简单地引用 URL。您可以按照这个SO来实现这一点。

无论哪种情况,我都建议您在编译时绑定此值。

于 2018-05-09T14:42:55.510 回答