
前几天看到这个的时候都无语了 24 号发布的firebase_auth 6.6.0有一个改动REFACTOR(auth,android): migrate native implementation to Kotlin也就是 FlutterFire 的firebase_authAndroid 插件刚从 Java 重写成 Kotlin而与此同时firebase_core 4.14.0也迁移到了 Kotlin迁移后的代码里有这样的 Java SAM 转换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 编译器能看到“这里有一个注解”但没办法加载这个注解的类所以最终报错Type annotation class org.checkerframework.checker.initialization.qual.UnknownInitialization of the inferred type is inaccessible.所以其实整个问题可以分成三层层级问题上游缺陷firebase-auth的 class 文件引用UnknownInitializationPOM 却没有声明checker-qualFlutterFire 触发器firebase_auth 6.6.0从 Java 迁移到 Kotlin出现了需要推断参数类型的 SAM lambdaKotlin 放大器Kotlin 2.3 对这个问题主要给警告Kotlin 2.4 将其作为编译错误处理所以问题在哪里有趣的就在Firebase Android SDK 的发布元数据一直存在这个缺口不过这个缺口之前一直没发现。然后叠加其他两个情况之后这个 Bug 才爆发出来所以在 Flutter 场景FlutterFire 修复也很简单没有增加checker-qual依赖它选择把两处 lambda 参数写成显式类型- FirebaseAuth.IdTokenListener { auth - FirebaseAuth.IdTokenListener { auth: FirebaseAuth -- FirebaseAuth.AuthStateListener { auth - FirebaseAuth.AuthStateListener { auth: FirebaseAuth -这样 Kotlin 就不再需要从带有缺失注解的 Java 签名中推断参数类型然后绕过了编译器报错路径而且 PR 还把测试工程升级到Kotlin 2.4.10AGP 8.11.1Gradle 8.14确保 CI 真正覆盖“在 Kotlin 2.4 下由警告变错误”的场景。而实际上在 Android 也是一样的Java 可能没问题但是 Kotlin 项目只要是使用 Kotlin 2.4classpath 中没有其他依赖偶然带入checker-qualKotlin 代码对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 本身反而没优化好也是讽刺