将API密钥保存在gradle.properties中

时间:2016-03-01 12:25:26

标签: android api

我是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{}块?

2 个答案:

答案 0 :(得分:20)

  1. 这种间接的想法是允许您将API密钥存储在未上载到版本控制的文件中:gradle.properties是本地文件,不应存储在版本控制下,{{1是一个生成的类,因此它只会在构建时创建。将API密钥作为普通String存储在某处肯定更容易,但是你必须将它提交到repo。
  2. 在构建期间,Gradle将生成BuildConfig文件以存储一些与构建相关的常量。您可以使用BuildConfig命令指示Gradle将自定义字段添加到buildConfigField。在构建项目之后,您可以在源代码中引用这些常量。

答案 1 :(得分:3)

引用-完整的实现,用于在gradle属性中存储API_KEY,以避免上载到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中添加以下行 buildConfigField(“ String”,“ API_KEY”,API_KEY)
  4. 使用以下语句“ BuildConfig.API_KEY”使用密钥 将此复制到需要API_KEY的任何地方

在Github中提交代码时,它将省去添加和删除API_KEY的工作。