Flutter应用使用telephony包接收短信时Release版本崩溃求助
Flutter Release版本接收短信崩溃排查
我开发了一款可自动扫描接收短信的Flutter应用,Debug版本运行一切正常,但Release版本在收到新短信时会崩溃。已按照telephony包文档配置所有权限,且在调用后台函数前添加了@pragma('vm:entry-point')注解。
崩溃堆栈信息
E/AndroidRuntime(22045): FATAL EXCEPTION: main E/AndroidRuntime(22045): Process: com.example.expense, PID: 22045 E/AndroidRuntime(22045): java.lang.RuntimeException: Unable to start receiver com.shounakmulay.telephony.sms.IncomingSmsReceiver: java.lang.NullPointerException: Attempt to read from field 'java.lang.String io.flutter.view.FlutterCallbackInformation.callbackLibraryPath' on a null object reference in method 'java.lang.String a1.a$b.toString()' E/AndroidRuntime(22045): at android.app.ActivityThread.handleReceiver(ActivityThread.java:4561) E/AndroidRuntime(22045): at android.app.ActivityThread.-$$Nest$mhandleReceiver(Unknown Source:0) E/AndroidRuntime(22045): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308) E/AndroidRuntime(22045): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime(22045): at android.os.Looper.loopOnce(Looper.java:240) E/AndroidRuntime(22045): at android.os.Looper.loop(Looper.java:351) E/AndroidRuntime(22045): at android.app.ActivityThread.main(ActivityThread.java:8364) E/AndroidRuntime(22045): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(22045): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) E/AndroidRuntime(22045): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013) E/AndroidRuntime(22045): Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String io.flutter.view.FlutterCallbackInformation.callbackLibraryPath' on a null object reference in method 'java.lang.String a1.a$b.toString()' E/AndroidRuntime(22045): at a1.a$b.toString(Unknown Source:22) E/AndroidRuntime(22045): at java.lang.String.valueOf(String.java:3657) E/AndroidRuntime(22045): at java.lang.StringBuilder.append(StringBuilder.java:132) E/AndroidRuntime(22045): at a1.a.i(Unknown Source:27) E/AndroidRuntime(22045): at s0.b.k(Unknown Source:62) E/AndroidRuntime(22045): at com.shounakmulay.telephony.sms.IncomingSmsReceiver.b(Unknown Source:30) E/AndroidRuntime(22045): at com.shounakmulay.telephony.sms.IncomingSmsReceiver.c(Unknown Source:129) E/AndroidRuntime(22045): at com.shounakmulay.telephony.sms.IncomingSmsReceiver.onReceive(Unknown Source:86) E/AndroidRuntime(22045): at android.app.ActivityThread.handleReceiver(ActivityThread.java:4545) E/AndroidRuntime(22045): ... 9 more
排查与解决方案
从堆栈信息看,崩溃根源是FlutterCallbackInformation.callbackLibraryPath空指针,这通常和Release模式下代码混淆、后台入口未被正确保留有关,可按以下步骤排查:
确认
@pragma('vm:entry-point')注解位置:必须直接放在顶级后台回调函数上方,不能嵌套在类或其他函数内部,示例:@pragma('vm:entry-point') void backgroundMessageHandler(SmsMessage message) { // 后台短信处理逻辑 }若回调是类的静态方法,注解也需直接加在静态方法上。
添加ProGuard/R8混淆规则:Release模式下的代码混淆可能删除了Flutter回调相关类,在
android/app/proguard-rules.pro中添加以下规则:# 保留telephony包所有类 -keep class com.shounakmulay.telephony.** { *; } # 保留Flutter回调信息类 -keep class io.flutter.view.FlutterCallbackInformation { *; } # 保留所有带vm:entry-point注解的方法 -keepclassmembers class * { @pragma('vm:entry-point') <methods>; }验证后台初始化逻辑:确保初始化telephony时,正确传入后台回调函数,且回调为顶级函数(或静态方法),示例:
final Telephony telephony = Telephony.instance; void main() { runApp(const MyApp()); telephony.listenIncomingSms( onNewMessage: (SmsMessage message) { // 前台短信处理 }, onBackgroundMessage: backgroundMessageHandler, // 传入顶级回调函数 ); }检查Flutter版本兼容性:部分旧版Flutter在Release模式下对后台入口的处理存在bug,建议升级到最新稳定版Flutter。
关闭电池优化:部分安卓系统会在后台杀死进程,导致广播接收器无法正常触发,需引导用户关闭应用的电池优化权限。
内容的提问来源于stack exchange,提问作者Sayam Sarkar
相关产品推荐
相关产品推荐

