RocketMQ源码深度解析(二)Netty通信、Broker心跳注册、消息收发、客户端负载均衡原理
2026/6/6 4:24:56
症状:Flutter 应用通过 Google Play 下载安装后,点击 Google 登录按钮报错:
GoogleSignInException(code GoogleSignInExceptionCode.canceled, [16] Account reauth failed., null)环境:
由于 Release 模式下print()不输出日志,创建了一个日志收集器在应用内显示错误详情:
import 'dart:developer' as developer; class GoogleAuthLogger { static final List<String> _logs = []; static void log(String message) { final timestamp = DateTime.now().toString().substring(11, 19); final entry = '[$timestamp] $message'; _logs.add(entry); developer.log(message, name: 'GoogleAuth'); } static String getLogs() => _logs.join('\n'); static void clear() => _logs.clear(); }在 UI 中添加"查看调试日志"按钮,登录失败时显示详细日志。
通过日志发现错误发生在Google 原生认证阶段(还没到 Supabase):
[22:46:47] 📱 触发 Google 登录界面 [22:46:49] ❌ Google 认证失败: GoogleSignInException(code GoogleSignInExceptionCode.canceled, [16] Account reauth failed., null)错误码[16] Account reauth failed表示SHA-1 指纹不匹配。
检查本地 Release keystore 的 SHA-1:
keytool -list -v -keystore ~/linguadiary-release-key.jks -alias linguadiary-key-alias输出:
SHA1: 13:0X:62:E7:BE:32:F4:E4:C1:0C:D6:04:BA:15:F7:BD:7D:49:13:C9Google Cloud Console 中的 Android OAuth Client 已配置这个 SHA-1,但还是失败...
应用是以AAB 格式上传到 Google Play 的,Google Play 会用自己的密钥重新签名 APK!
这意味着用户下载的 APK 签名与本地 keystore 不同。
| 证书 | SHA-1 | 谁持有 | 用途 |
|---|---|---|---|
| Upload Key(上传密钥) | 13:0F:61:E7:... | 开发者本地 | 上传 AAB 到 Google Play 时验证身份 |
| App Signing Key(应用签名密钥) | DC:B4:A6:04:... | Google 服务器 | 给用户下载的 APK 签名 |
流程图:
开发者电脑 Google Play 用户手机 │ │ │ │ 1. 用 Upload key 签名 │ │ │ AAB 上传 │ │ ├──────────────────────────►│ │ │ │ 2. Google 用 │ │ │ App signing key │ │ │ 重新签名 APK │ │ ├──────────────────────────►│ │ │ │ │ │ 用户安装的 APK │ │ │ 签名 = App signing key│由于之前用错误的 SHA-1 尝试过登录,手机缓存了旧配置:
⚠️ 注意:普通用户不需要这一步,只有测试设备因缓存旧数据才需要清除。
dart:developer的log()函数serverClientId参数