我是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{}
块?
答案 0 :(得分:20)
gradle.properties
是本地文件,不应存储在版本控制下,{{1是一个生成的类,因此它只会在构建时创建。将API密钥作为普通String存储在某处肯定更容易,但是你必须将它提交到repo。BuildConfig
文件以存储一些与构建相关的常量。您可以使用BuildConfig
命令指示Gradle将自定义字段添加到buildConfigField
。在构建项目之后,您可以在源代码中引用这些常量。答案 1 :(得分:3)
引用-完整的实现,用于在gradle属性中存储API_KEY,以避免上载到Github。
https://richardroseblog.wordpress.com/2016/05/29/hiding-secret-api-keys-from-git/
在Github中提交代码时,它将省去添加和删除API_KEY的工作。