Firebase 如何让全球 Android 和 Flutter 开发者集体 Build Fail

前几天看到这个的时候都无语了, 24 号发布的 firebase_auth 6.6.0 有一个改动:REFACTOR(auth,android): migrate native implementation to Kotlin ,也就是 FlutterFire 的 firebase_auth Android 插件刚从 Java 重写成 Kotlin,而与此同时,firebase_core 4.14.0 也迁移到了 Kotlin,迁移后的代码里有这样的 Java SAM 转换:

rust 复制代码
FirebaseAuth.IdTokenListener { auth ->
    // auth 类型由 Kotlin 推断
}

IdTokenListener 是 Firebase Android SDK 提供的 Java 单抽象方法接口,而 Kotlin 为了推断 auth 的类型,需要读取 Firebase SDK class 文件里的完整类型信息。

然后这时候问题就来了:firebase-auth:24.2.0 的 class 文件引用了 Checker Framework 的:

复制代码
org.checkerframework.checker.initialization.qual.UnknownInitialization

但它发布到 Maven 的 POM 实际上一直没有声明 checker-qual,导致 Kotlin 编译器能看到"这里有一个注解",但没办法加载这个注解的类,所以最终报错:

python 复制代码
Type annotation class
'org.checkerframework.checker.initialization.qual.UnknownInitialization'
of the inferred type is inaccessible.

所以其实整个问题可以分成三层:

层级 问题
上游缺陷 firebase-auth 的 class 文件引用 @UnknownInitialization,POM 却没有声明 checker-qual
FlutterFire 触发器 firebase_auth 6.6.0 从 Java 迁移到 Kotlin,出现了需要推断参数类型的 SAM lambda
Kotlin 放大器 Kotlin 2.3 对这个问题主要给警告,Kotlin 2.4 将其作为编译错误处理

所以问题在哪里?有趣的就在,Firebase Android SDK 的发布元数据一直存在这个缺口,不过这个缺口之前一直没发现。

然后叠加其他两个情况之后,这个 Bug 才爆发出来,所以在 Flutter 场景,FlutterFire 修复也很简单,没有增加 checker-qual 依赖,它选择把两处 lambda 参数写成显式类型:

diff 复制代码
- FirebaseAuth.IdTokenListener { auth ->
+ FirebaseAuth.IdTokenListener { auth: FirebaseAuth ->
diff 复制代码
- FirebaseAuth.AuthStateListener { auth ->
+ FirebaseAuth.AuthStateListener { auth: FirebaseAuth ->

这样 Kotlin 就不再需要从带有缺失注解的 Java 签名中推断参数类型,然后绕过了编译器报错路径,而且 PR 还把测试工程升级到:

  • Kotlin 2.4.10
  • AGP 8.11.1
  • Gradle 8.14

确保 CI 真正覆盖"在 Kotlin 2.4 下由警告变错误"的场景。

而实际上在 Android 也是一样的,Java 可能没问题,但是 Kotlin 项目,只要是:

  • 使用 Kotlin 2.4
  • classpath 中没有其他依赖偶然带入 checker-qual
  • Kotlin 代码对 FirebaseAuth.IdTokenListener、AuthStateListener 使用参数类型推断

那 Kotlin 的 Andorid 也一样要挂,这个等于是一个长期存在的 bug , Firebase Auth AAR 发布时漏了 Checker Framework 编译依赖,直到 FlutterFire 6.6.0 的 Kotlin 重写和 Kotlin 2.4 类型推断组合才发现问题,只能说这种 Bug 太典了,之前没问题只是没诱因,很多低级错误都是不知不觉沉淀下来的。

甚至前 Flutter 创始人 Eric 也公开吐槽 Firebase 架构有问题,说到底 Google Play 一直喊着要大家 R8 和优化,但是你自己的 SDK 本身反而没优化好,也是讽刺:

相关推荐
To_OC5 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
excel7 小时前
研究 Vue 3 源码的收获
前端·vue.js
Android系统攻城狮7 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
可乐鸡翅yeah_9 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
lerhxx9 小时前
AI 应用如何高效优雅地恢复中断?—— "连接解耦 + 状态持久化"
前端·javascript
计算机魔术师9 小时前
METR 演示 AI 智能体如何篡改 Inspect 评估记录以掩盖不当行为
前端
前端snow10 小时前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路10 小时前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他10 小时前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程
mantou13210 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端