You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Telephony插件Release模式下后台/终止状态异常求助

解决Telephony插件Release模式后台/终止状态报错问题

针对你遇到的Dart Error: Dart_LookupLibrary: library 'package:telephony/telephony.dart' not found问题,以下是几个可行的解决思路:

  • 剥离后台函数对Telephony库的直接依赖
    后台回调函数里不要直接调用Telephony插件的API或引用其非必要类型,比如不要在backgroundMessageHandler里使用SmsMessage之外的库内对象。Release模式的tree shaking会移除未被主流程引用的库代码,后台函数的引用不会被编译器识别为"活跃"引用,导致库代码被清理。

  • 确认@pragma装饰器的正确使用
    装饰器必须直接放在顶层独立函数上方,不能嵌套在类、闭包或者其他函数里,示例代码:

    @pragma('vm:entry-point')
    void backgroundSmsHandler(SmsMessage message) {
      // 仅做基础消息处理,比如写入本地存储或触发原生通知
      // 避免调用Telephony.instance这类插件实例方法
    }
    
  • 强制保留Telephony库代码
    在主入口文件(比如main.dart)中添加一个无实际业务逻辑的引用,强制编译器保留库代码:

    import 'package:telephony/telephony.dart' as telephony;
    
    void _preventTreeShaking() {
      // 空函数,仅用于标记库代码需要保留
      telephony.Telephony? _unused;
    }
    
    void main() {
      _preventTreeShaking(); // 调用一次,确保编译器不会摇掉Telephony库
      runApp(const MyApp());
    }
    
  • 检查安卓原生配置完整性
    确保AndroidManifest.xml里的短信接收器和权限配置在Release模式下没有被混淆工具移除,添加混淆规则:

    -keep class com.shounakmulay.telephony.** { *; }
    

    同时确认权限和接收器声明正确:

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    
    <receiver android:name="com.shounakmulay.telephony.sms.IncomingSmsReceiver"
              android:exported="true">
      <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
      </intent-filter>
    </receiver>
    

核心原因是Release模式下的tree shaking机制会移除未被主程序路径引用的代码,即便后台函数加了@pragma('vm:entry-point'),如果它依赖的库代码没有被主流程引用,依然会被清理,导致后台运行时找不到库文件。

内容的提问来源于stack exchange,提问作者wjlester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:38:26