Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在gradle.properties中保存API密钥_Android_Api - Fatal编程技术网

Android 在gradle.properties中保存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

我是android新手,在一个项目中,我看到我得到的API密钥保存在
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{}

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

  • 请参阅-在gradle属性中存储API_密钥的完整实现,以避免上载到Github


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

  • 在gradle.properties文件中添加行

  • defaultConfig

    buildConfigField(“字符串”、“API\U键”、API\U键)

  • 使用下面的语句使用Key

    String API_KEY=BuildConfig.API_KEY

  • 在需要API_密钥的地方复制此文件


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

    谢谢。你的问题帮助我配置了我的项目。这是一个界限。你应该扩展你的答案,在这里包含尽可能多的信息,并使用链接仅供参考。当然,我已经简单地添加了详细信息。如果您有任何疑问,请让我知道。此答案比其他答案更容易理解,谢谢:)此方法要求您记住将文件添加到.gitignore中,并将其从git中删除,因为它是默认添加的。此外,项目级文件还包含您希望与团队共享的其他设置。它有自己的问题,但全局gradle.properties文件更适合敏感密钥。在apk上进行反向工程安全吗?@SumitShukla,不安全,API密钥仍然是一个常量字符串,可以在反编译时轻松定位。如果您希望某个值不受反向工程的影响,那么它应该存在于服务器上。您可以采用其他类似的方法: