Android 在gradle.properties中保存API密钥
我是android新手,在一个项目中,我看到我得到的API密钥保存在Android 在gradle.properties中保存API密钥,android,api,Android,Api,我是android新手,在一个项目中,我看到我得到的API密钥保存在gradle.properties中,如下所示: MyOpenWeatherMapApiKey=“1c3ae96f93a0094e8a7chsjdgfid04aed3f10” 然后在build.gradle(模块:app)中添加以下行: buildTypes.each { it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', MyOpenWea
gradle.properties
中,如下所示:
MyOpenWeatherMapApiKey=“1c3ae96f93a0094e8a7chsjdgfid04aed3f10”
然后在build.gradle(模块:app)
中添加以下行:
buildTypes.each {
it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', MyOpenWeatherMapApiKey
}
因此,在我的主程序中,我使用api访问数据,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());
所以,我的问题是,为什么要在gradle部分中存储appid时,要承受所有的压力呢。我们不能只在主程序中直接访问吗
我问题的第二部分是gradle部分中实际发生了什么,特别是对于buildTypes.each{}
块
gradle.properties
是本地文件,不应存储在版本控制下,BuildConfig
是生成的类,因此它只会在生成时创建。将API密钥作为普通字符串存储在某个地方肯定更容易,但随后您必须将其提交到repoBuildConfig
文件来存储一些与构建相关的常量。您可以使用buildConfigField
命令指示Gradle将自定义字段添加到BuildConfig
中。构建项目后,可以在源代码中引用这些常量请参阅-在gradle属性中存储API_密钥的完整实现,以避免上载到Github
gradle.properties
添加到.gitignore
文件中
defaultConfig
buildConfigField(“字符串”、“API\U键”、API\U键)
String API_KEY=BuildConfig.API_KEY代码>
在Github中提交代码时添加和删除API_密钥将节省您的工作量。谢谢。你的问题帮助我配置了我的项目。这是一个界限。你应该扩展你的答案,在这里包含尽可能多的信息,并使用链接仅供参考。当然,我已经简单地添加了详细信息。如果您有任何疑问,请让我知道。此答案比其他答案更容易理解,谢谢:)此方法要求您记住将文件添加到.gitignore中,并将其从git中删除,因为它是默认添加的。此外,项目级文件还包含您希望与团队共享的其他设置。它有自己的问题,但全局gradle.properties文件更适合敏感密钥。在apk上进行反向工程安全吗?@SumitShukla,不安全,API密钥仍然是一个常量字符串,可以在反编译时轻松定位。如果您希望某个值不受反向工程的影响,那么它应该存在于服务器上。您可以采用其他类似的方法: