根据 google 的建议,设置限制,例如指定包名称和 SHA-1 密钥是要走的路。
这里已经解释过了:https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key
现在,这里的问题是,无论您做什么,您的 API 密钥都将在代码库中结束,即,如果您在代码库之外指定它(通过一些属性文件)但在构建阶段通过 BuildConfig 字段将其传递(整个密钥对反编译您的代码的人可见,因为它现在是 BuildConfig 类文件的一部分)或者您将其拆分并在代码库中连接(拆分密钥仍然可见,任何人都可以通过查看使用来连接它们以获得最终密钥来自反编译的 apk)。
拆分密钥版本将消除 Play 管理中心的警告,但密钥仍然暴露。
因此,我建议的解决方案是对您的 API 密钥进行编码并将其传递给您的代码库。就在使用它之前,你将它解码回来。
一个非常简单的例子可以是:
请使用更好的编码算法而不是这个,这仅用于演示目的。这里我们使用 Base64 编码。
import android.util.Base64
fun main() {
// API Key = "123456ABC"
val myEncodedApiKey = "MTIzNDU2QUJD" // Should be passed via BuildConfig
val decodedApiKey = Base64.decode(myEncodedApiKey, Base64.DEFAULT)
// Now use `decodedApiKey` in your codebase.
val decodedApiKeyString = String(decodedApiKey)
}
为什么这样更好?
- 您的密钥与 GCP 项目中的密钥不完全相同。
- 播放控制台在扫描您的代码库时,无法将其匹配回您的 GCP 项目 API 密钥。因此没有警告。
更新(关于使用 google-services.json 文件获取 API 密钥的说明):
使用来自 google-services.json 的 API 密钥的解决方案不太有效。如果您连接您的 Firebase 帐户,通常会生成 google-services.json 文件。此处定义的 API 密钥具有不同的限制模型。您在 GCP 项目中定义的是不同的,它允许您传入包名称和 SHA-1 密钥,并限制为特定类型的 API 访问,例如仅 Youtube 访问。因此,如果要使用来自 google-services.json 的 API 密钥,那么您基本上没有使用您在 GCP 帐户中设置的限制。 GCP 帐户不会生成 google-services.json 文件。
这里有一个来自谷歌的官方文档,用于设置使用 GCP 项目定义的 API 密钥的 Youtube API,在文档中,它提到直接将密钥放入代码中。 (这无论如何都是错误的,因为它被暴露了,但那是你的谷歌)。
https://developers.google.com/youtube/android/player/setup
在任何文档中都没有提到使用 google-services.json 文件来检索 API 密钥。