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
相关产品推荐
相关产品推荐

