Android 16下Credential Manager谷歌登录报DEVELOPER_ERROR问题求助
针对Android 16设备上Credential Manager结合Firebase Auth登录失效、应用冻结并抛出SecurityException: Unknown calling package name 'com.google.android.gms'的问题,结合你已排查的常规配置,给出以下针对性排查点:
1. 升级Credential Manager相关依赖版本
Android 16作为较新的系统版本,旧版androidx.credentials库可能存在适配缺陷。确保使用最新稳定版依赖:
implementation("androidx.credentials:credentials:1.2.2") implementation("androidx.credentials:credentials-play-services-auth:1.2.2")
同步升级Firebase Auth依赖至最新稳定版,避免版本不兼容。
2. 验证Google Play Services版本兼容性
你当前使用的Play Services 26.18.33可能存在Android 16适配bug,尝试:
- 将设备上的Google Play Services更新至最新版本(通过Google Play商店)
- 若更新后问题仍存在,回退到26.17.x系列的稳定版本测试
3. 检查Nonce生成逻辑
确保generateSecureRandomNonce()生成的随机串符合要求:
- 长度至少16字节
- 使用Base64 URL安全编码(无填充)
示例正确实现:
private fun generateSecureRandomNonce(): String { val nonceBytes = ByteArray(16) SecureRandom().nextBytes(nonceBytes) return Base64.encodeToString(nonceBytes, Base64.URL_SAFE or Base64.NO_PADDING) }
4. 补充AndroidManifest配置
添加Google Play Services版本元数据声明,避免版本校验失败:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
同时确认已声明INTERNET权限(登录流程必须):
<uses-permission android:name="android.permission.INTERNET" />
5. 调整Credential Manager调用逻辑
尝试在GetGoogleIdOption中添加setAutoSelectEnabled(false),避免自动选择逻辑在Android 16上触发异常:
val googleIdOption = GetGoogleIdOption.Builder() .setFilterByAuthorizedAccounts(false) .setServerClientId(BuildConfig.GOOGLE_CLIENT_ID) .setNonce(generateSecureRandomNonce()) .setAutoSelectEnabled(false) .build()
同时确保调用Credential Manager时使用Activity上下文而非Application上下文,避免上下文权限问题。
6. 排查应用签名配置
虽然已添加SHA-1/SHA-256到Firebase,仍需确认debug/release构建使用的签名文件与Firebase后台配置完全一致。可通过以下命令重新获取当前构建的签名指纹:
keytool -list -v -keystore your-keystore-path.jks -alias your-alias
对比Firebase后台的指纹是否完全匹配。
已知问题参考
目前Google Play Services 26.18.x系列在部分Android 16设备上存在Credential Manager相关兼容性问题,已有开发者反馈类似Unknown calling package name异常,Google正在跟进修复。若上述方案均无效,可暂时回退到26.17.x版本的Play Services作为临时解决方案。
内容的提问来源于stack exchange,提问作者Rostyslav

