【问题标题】:Saving the API Key in gradle.properties在 gradle.properties 中保存 API 密钥
【发布时间】:2016-06-13 20:53:38
【问题描述】:

我是 android 新手,正在从事一个项目,我看到我得到的 API 密钥保存在 gradle.properties 中:

MyOpenWeatherMapApiKey="1c3ae96f93a0094e8a7chsjdgfid04aed3f10"

然后在build.gradle(module:app) 中添加以下几行:

buildTypes.each {
            it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', MyOpenWeatherMapApiKey
      }

所以,在我的主程序中,我使用这个 api 访问数据,其 URL 是由这段代码获取的:

final String FORECAST_BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/daily?";
            final String QUERY_PARAM = "q";
            final String FORMAT_PARAM = "mode";
            final String UNITS_PARAM = "units";
            final String DAYS_PARAM = "cnt";
            final String APPID_PARAM = "APPID";
            Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon()
                    .appendQueryParameter(QUERY_PARAM, params[0])
                    .appendQueryParameter(FORMAT_PARAM, format)
                    .appendQueryParameter(UNITS_PARAM, units)
                    .appendQueryParameter(DAYS_PARAM, Integer.toString(numDays))
                    .appendQueryParameter(APPID_PARAM, BuildConfig.OPEN_WEATHER_MAP_API_KEY)
                    .build();
            URL url = new URL(builtUri.toString());

所以,我的问题是,为什么要在进行更改时将 appid 存储在 gradle 部分中。不能只在主程序中直接访问吗?

我的问题的第二部分是 gradle 部分实际发生了什么,尤其是 buildTypes.each{} 块?

【问题讨论】:

  • 谢谢。您的问题帮助我配置了我的项目。

标签: android api


【解决方案1】:

在 gradle.properties 中保存 API 密钥可能不是一个好主意。使用 local.properties 文件会更有说服力。由于 local.properties 文件默认会添加到 git ignore 文件中,我相信这将是添加 API 密钥的好地方。

要在本地属性中添加 API_key,您可以按照以下两个简单步骤操作。

第 1 步

打开您的 local.properties 文件并添加以下代码

sdk.dir=/Users/Library/Android/sdk
API_KEY=**Your Key**

第 2 步

打开您的应用级 build.gradle 文件并在 defaultConfig 中添加“buildConfigField”,如下所示。

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

buildConfigField "String", "API_KEY", "${properties.getProperty('API_KEY')}"

第 3 步

将您的项目与 Gradle 更改同步。

第 4 步

从 Build->Rebuild Project 重建您的项目。

全部完成!!现在您可以通过调用BuildConfig.API_KEY来访问密钥

【讨论】:

    【解决方案2】:

    参考 - 将 API_KEY 存储在 gradle 属性中以避免上传到 Github 的完整实现。

    https://richardroseblog.wordpress.com/2016/05/29/hiding-secret-api-keys-from-git/


    1. gradle.properties 添加到.gitignore 文件中

    2. gradle.properties文件API_KEY="CopyYourAPI_KEYhere"中添加一行

    3. app/build.gradle 中的defaultConfig 中添加以下行

      buildConfigField("String", "API_KEY", API_KEY)

    4. 使用以下语句使用密钥

      String API_KEY = BuildConfig.API_KEY;

    将其复制到您需要 API_KEY 的任何位置

    这将节省您在 Github 中提交代码时添加和删除 API_KEY 的工作量。

    【讨论】:

    • 这是一个边界线link-only answer。您应该在此处扩展您的答案以包含尽可能多的信息,并使用该链接仅供参考。
    • 当然,我已经简短地添加了详细信息。如果您有任何疑问,请告诉我。
    • 这个答案比其他人容易理解,谢谢:)
    • 此方法要求您记住将文件添加到您的 .gitignore 并从 git 中删除它,因为它是默认添加的。此外,项目级文件还有您希望与团队共享的其他设置。它有自己的问题,但 GLOBAL gradle.properties 文件更适合敏感键。
    • 如果你想在不同的模块上使用 KEY 怎么办?
    【解决方案3】:
    1. 这种间接的想法是允许您将 API 密钥存储在未上传到版本控制的文件中:gradle.properties 是本地文件,不应存储在版本控制下,BuildConfig 是生成的类,所以它只会在构建时创建。将 API 密钥作为纯字符串存储在某处肯定更容易,但是您必须将其提交到 repo。
    2. 在构建期间,Gradle 会生成BuildConfig 文件来存储一些与构建相关的常量。您可以使用buildConfigField 命令来指示Gradle 将自定义字段添加到BuildConfig。项目构建完成后,您可以在源代码中引用这些常量。

    【讨论】:

    • 对 apk 进行逆向工程是否安全?
    • @SumitShukla,并非如此,API 密钥最终仍将是一个常量字符串,可以在反编译时轻松定位。如果您希望某些值免受逆向工程的影响,那么它应该存在于服务器上。
    • 如果您将 API_KEY 放入您的应用程序中,那么您需要启用 proguard 以使密钥被混淆。否则,保护您的 api_keys 的更好方法是将它们保存在您的服务器中并在运行时获取它。
    • @SonuSanjeev,我认为 proguard 没有办法混淆字符串文字,但我可能错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多