在 Google Play 商店控制台上传构建时出现错误。错误如下。
泄露的 GCP API 密钥 您的应用程序包含公开的 Google Cloud Platform (GCP) API 密钥。
罪魁祸首代码如下。
Places.initialize(getApplicationContext(), BuildConfig.GOOGLE_API_KEY);
根据我正在阅读的文档,我正在从BuildConfig中读取密钥并限制密钥。但问题仍然存在。如何解决这个问题。
在 Google Play 商店控制台上传构建时出现错误。错误如下。
泄露的 GCP API 密钥 您的应用程序包含公开的 Google Cloud Platform (GCP) API 密钥。
罪魁祸首代码如下。
Places.initialize(getApplicationContext(), BuildConfig.GOOGLE_API_KEY);
根据我正在阅读的文档,我正在从BuildConfig中读取密钥并限制密钥。但问题仍然存在。如何解决这个问题。
我也面临相同问题,找不到适当的解决方案。经过大量搜索,我找到了一个解决方案。因此,我提供了一个完整的解决方案。
感谢Prasenjit Banerjee的帮助。
在Google Play Console中使用API密钥并避免泄露的GCP API密钥安全问题的完整指南:
首先,您需要遵循API安全最佳实践以添加限制并安全地使用API密钥。
然后按照设置Android Studio项目将API密钥添加到local.properties
并在AndroidManifest.xml
和主程序中使用它们。
最后,在您的AndroidManifest.xml
文件中将API密钥作为变量访问:
<application>
.
.
.
.
<activity>
.
.
.
.
</activity>
<meta-data
android:name = "keyValue"
android:value = "${KEY}"/>
</application>
MainActivity.kt
中访问API密钥,并输入以下代码从AndroidManifest.xml
的元数据中获取KEY值(从GeeksforGeeks的这篇文章中查找解决方案):
BuildConfig
类来获取这些API密钥,因为这个类会将这些属性公开为变量。class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//get the KEY value from the meta-data in AndroidManifest
val ai: ApplicationInfo = applicationContext.packageManager
.getApplicationInfo(applicationContext.packageName, PackageManager.GET_META_DATA)
val value = ai.metaData["keyValue"]
val key = value.toString()
//for testing only
Toast.makeText(applicationContext, key, Toast.LENGTH_LONG).show()
// use this key to initialize places sdk
Places.initialize(applicationContext, key)
}
}
release
构建类型设置特定的密钥,创建一个名为release.properties
的新文件,其中包含特定于发布的密钥。@HamidJaved @Amal - Milan Majirelease
构建类型的密钥,创建一个名为release.properties
的新文件,其中包含特定于发布的密钥。@HamidJaved @Amal - undefined你不应该直接从BuildConfig的本地属性中获取GCP密钥。我通过使用这个扩展函数从应用程序元数据中获取密钥来修复了它。
fun Context.getKey(): String {
val applicationInfo = packageManager
.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
val keyValue = applicationInfo.metaData?.get("com.google.android.geo.API_KEY")
return keyValue.toString()
}
所以当你想要获取密钥时,可以使用
Places.initialize(getApplicationContext(), requiredContext.getKey());
Places.initialize(getApplicationContext(), this.getKey());