在过去的几周里,我们的一些用户(但不是全部)在应用程序中打开 Google 地图时遇到了此崩溃:
java.lang.SecurityException: PackageVerificationRslt: not allowed: pkg=com.my.app, sha256=[<sha256 of our release signing key>], atk=false, ver=243700036.true
at android.os.Parcel.createExceptionOrNull(Parcel.java:3242)
at android.os.Parcel.createException(Parcel.java:3226)
at android.os.Parcel.readException(Parcel.java:3209)
at android.os.Parcel.readException(Parcel.java:3151)
at com.google.android.gms.common.internal.zzac.getService(com.google.android.gms:play-services-basement@@18.1.0:46)
at com.google.android.gms.common.internal.BaseGmsClient.getRemoteService(com.google.android.gms:play-services-basement@@18.1.0:159)
at com.google.android.gms.common.api.internal.zaap.zaa(com.google.android.gms:play-services-base@@18.0.1:44)
at com.google.android.gms.common.api.internal.zaav.run(com.google.android.gms:play-services-base@@18.0.1:26)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:487)
at java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at com.google.android.gms.common.util.concurrent.zza.run(com.google.android.gms:play-services-basement@@18.1.0:7)
at java.lang.Thread.run(Thread.java:1012)
导致这些崩溃的一系列事件:
我将与调试密钥相对应的 OAuth 2.0 客户端 ID 添加到 Google Cloud Console,以便在
debug
版本中使用 Google 登录(注意:我们对 debug
和 release
版本使用相同的应用 ID)。效果很好。
部分生产用户在尝试使用 Google 地图时开始遇到上述崩溃问题。
要求受影响的用户清除缓存、数据、重新启动设备、重新安装应用程序 - 没有任何帮助。
我删除了新的客户端 ID。
用户仍然会遇到崩溃。
简单删除新的客户端 ID 并不能解决问题后,我还删除了与
release
版本对应的旧客户端 ID,然后立即将其添加回来。没有帮助。
我不知道如何处理这些崩溃并帮助用户。将不胜感激任何帮助。
您遇到的问题似乎与您的应用程序和 Google 服务(OAuth、Maps API)之间的包验证有关,特别是在调试和发布版本使用相同的应用程序 ID 时。如果两个环境之间的 OAuth 凭据或 API 密钥未正确对齐,有时可能会产生冲突。
以下是排查和解决此问题的一些步骤:
验证您的调试和发布 SHA-256 指纹是否已正确添加到 Google Cloud Console 的“凭据”部分下。
确保您已将发布 SHA-256 指纹与生产环境的 OAuth 2.0 客户端 ID 正确关联。混合调试和发布凭据可能会导致此类问题,特别是如果它们共享相同的应用程序 ID。
对于 Google Maps API 密钥,请确保您已根据应用程序的包名称和正确的 SHA-256 指纹设置限制。
删除可能导致问题的任何不必要的限制,尤其是那些可能因指纹不匹配而阻止用户访问 Maps API 的限制。
错误消息包含引用 ver=243700036.true,这可能表示 Google Play 服务版本或 Google Play Integrity API 不匹配。
确保受影响的用户正在运行更新版本的 Google Play 服务,并且他们的设备与您应用的当前版本兼容。
如果您使用 Google Play Integrity API,请验证其配置是否在应用后端正确设置。
在极少数情况下,Google Play 服务可能会缓存无效或过时的 OAuth 令牌。您可以尝试清除受影响用户的缓存令牌:
要求他们转到“设置”→“应用程序”→“Google Play 服务”并清除缓存和数据。
确保他们使用具有正确 OAuth 凭据的最新版本的应用程序。
虽然使用相同的应用程序 ID 进行调试和发布版本很方便,但它可能会导致冲突,尤其是与 Google 的 OAuth 和 API 密钥发生冲突。尝试对应用程序的调试版本和发布版本使用单独的应用程序 ID 或 API 密钥以避免此问题。
在 Play 商店控制台的预启动报告或崩溃报告部分中查找任何错误。这可以为您提供有关受影响用户的更多详细信息,例如设备配置或区域,这可能有助于识别问题。
更深入地分析受影响用户的日志。您可能会在他们使用的设备、区域或 Android 版本中发现常见模式,这可能会带来解决方案,例如更新兼容性设置。