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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:29:54