Flutter 3.22+ 版本中,telephony 包在 Release 模式下因后台回调机制变更导致空指针异常崩溃;根本原因在于 Flutter 新版 AOT 编译移除了部分反射元数据,使 FlutterCallbackInformation 初始化失败。降级至稳定兼容版本可快速修复。
flutter 3.22+ 版本中,`telephony` 包在 release 模式下因后台回调机制变更导致空指针异常崩溃;根本原因在于 flutter 新版 aot 编译移除了部分反射元数据,使 `fluttercallbackinformation` 初始化失败。降级至稳定兼容版本可快速修复。
在使用 telephony(v0.3.0+)监听短信时,许多开发者发现:Debug 模式运行正常,但 Release 构建后应用在收到 SMS 瞬间崩溃,并抛出类似以下关键错误:
java.lang.NullPointerException: Attempt to read from field 'java.lang.String io.flutter.view.FlutterCallbackInformation.callbackLibraryPath' on a null object reference
该异常并非权限或 AndroidManifest 配置问题(即使已正确声明 RECEIVE_SMS、READ_SMS 及
✅ 经验证的解决方案(推荐顺序):
-
优先降级 Flutter SDK 至稳定兼容版本
当前已确认稳定工作的版本为:flutter downgrade 3.19.6 # 最新稳定兼容版(截至 2024 年中)
⚠️ 注意:执行 flutter downgrade 后需清理构建缓存:
flutter clean && flutter pub get cd android && ./gradlew clean && cd ..
-
若必须使用新版 Flutter,请临时规避 telephony 的后台回调机制
改用前台监听(仅适用于用户处于应用内场景):final telephony = Telephony.instance; await telephony.initialize(); telephony.listenToSms( onSmsReceived: (SmsMessage message) { debugPrint('SMS received: ${message.body}'); // ✅ 此回调在主线程执行,不依赖 FlutterCallbackInformation }, );并在 AndroidManifest.xml 中 移除 IncomingSmsReceiver 声明(避免系统触发崩溃的广播接收器)。
-
长期建议:迁移到更现代的替代方案
telephony 包已长期未维护(最后更新于 2022 年)。推荐转向:- sms_maintained(社区维护分支,适配较新 Flutter)
- 或使用平台通道 + 原生 Android SmsRetrieverClient(更安全、无需敏感权限)
? 重要提醒:
- @pragma('vm:entry-point') 仅标记 Dart 函数不被混淆,不能修复 FlutterCallbackInformation 初始化失败的根本问题;
- Android 10+ 设备上,READ_SMS 权限已被严格限制,建议改用 SmsRetrieverApi(免权限获取一次性验证码);
- 所有 SMS 相关功能必须在 android/app/src/main/AndroidManifest.xml 中显式声明 android:exported="true"(Android 12+ 要求)。
综上,该崩溃是 Flutter 版本演进与老旧插件不兼容的典型表现。短期通过降级 SDK 快速止损,中长期务必切换至活跃维护的通信插件或原生集成方案,以保障稳定性与合规性。










