Android – 使用 local.properties 文件避免 API 密钥签入到版本控制系统
作为一名 Android 开发人员,最好的方面之一就是能够创建和贡献于开源项目!我们有能力与全球数百万开发人员共享我们的代码。现在,当我们将代码作为公共存储库提供时,我们必须确保处理某些事情,例如私有 API 密钥的共享、受限 URL 等。我们如何使用根项目中的“ local.propertie s”文件来做到这一点?在本文中,我们将一探究竟。
分步实施
当我们在 Android Studio 中创建一个新项目时,会创建一个名为“local.properties”的文件,其内容如下:
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=The Sdk Directory path
所以local.properties是 Android Studio 生成的文件,不应该包含在版本控制系统中。所以,看一下我们的 gitignore 文件,我们有:
*.iml
.gradle
/local.properties
/.idea
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
/buildSrc/build/*
我们可以看到版本控制系统已经排除了文件local.properties。
GeekTip: It is critical to update the gitignore files with the appropriate extensions and file folders when starting an open-source project. Because the “local.properties” file is not shared by the version control system, we can use it to declare our local user-specific variables or private variables like API keys or restricted base URLs, and so on.
该项目有助于开发类似于 Uber 和 Lyft 的拼车 Android 出租车。你可以分叉它并学习很多很酷的功能。请阅读自述文件以获取有关该项目的更多信息。现在,因为我们的用例是一个拼车应用程序,我们将把谷歌地图整合到其中。要使用 Google 地图,开发人员必须拥有 API 密钥。让我们看看如何使用“local.properties”文件来做到这一点。首先,将以下参数添加到 local.properties 文件中:
sdk.dir=The sdk directory //already existing parameter
yourApi = ANY_OF_YOUR_API_KEY_HERE
然后要提取值,我们只需:
def someExtraProperty = new Properties()
someExtraProperty.load(new FileInputStream(rootProject.file("local.properties")))
现在要在使用时访问我们的 API 密钥,我们可以:
someExtraProperty['yourApiKey'] (or)
someExtraProperty.getProperty("YourAPIKey")
在构建过程中会生成一些文件,例如 gradleResValues.xml 和 BuildConfig。Java让我们使用这些文件来保存 API 密钥的值。我们如何将值插入到构建过程中生成的文件中?在我们的应用级构建中,我们将使用 buildTypes 部分。梯度源代码
android {
.....
buildTypes {
debug {
resValue("string", "gmaps_key", localProperties['yourApiKey'])
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
这是编译包时res文件夹中默认生成的值
GMAPS_API_KEY_GOES_HERE
要在应用程序中使用此值,请尝试按如下方式提取值:
resources.getString(R.string.gmaps_key)
然后只需声明一个最终变量来存储字符串:
Java
public static final String GMAPS_API = your gmaps key;
结论
您现在可以通过在自述文件中包含一个 TODO 语句来愉快地将此代码作为公共存储库分发,该语句指出应该存在所需的构建配置参数或 gradleResValuess.xml 参数。用户只需在 TODO 中添加信息,瞧,工作又回来了!我们可以通过使用 local.properties 文件来声明本地、用户特定参数或受限 URL,从而避免在应用程序级代码中硬编码字符串。