Flutter集成flutter_sentry后启动报错,求解决方案
Flutter配置sentry_flutter后启动报错:Reply already submitted及Invalid app start data
错误日志
W/Sentry ( 7120): Invalid app start data: app not launched in foreground or app start took too long (>60s) E/MethodChannel#sentry_flutter( 7120): Failed to handle method call E/MethodChannel#sentry_flutter( 7120): java.lang.IllegalStateException: Reply already submitted E/MethodChannel#sentry_flutter( 7120): at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.java:431) E/MethodChannel#sentry_flutter( 7120): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:272) E/MethodChannel#sentry_flutter( 7120): at io.sentry.flutter.SentryFlutterPlugin.fetchNativeAppStart(SentryFlutterPlugin.kt:229) E/MethodChannel#sentry_flutter( 7120): at io.sentry.flutter.SentryFlutterPlugin.onMethodCall(SentryFlutterPlugin.kt:74) E/MethodChannel#sentry_flutter( 7120): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267) E/MethodChannel#sentry_flutter( 7120): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292) E/MethodChannel#sentry_flutter( 7120): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319) E/MethodChannel#sentry_flutter( 7120): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) E/MethodChannel#sentry_flutter( 7120): at android.os.Handler.handleCallback(Handler.java:942) E/MethodChannel#sentry_flutter( 7120): at android.os.Handler.dispatchMessage(Handler.java:99) E/MethodChannel#sentry_flutter( 7120): at android.os.Looper.loopOnce(Looper.java:201) E/MethodChannel#sentry_flutter( 7120): at android.os.Looper.loop(Looper.java:288) E/MethodChannel#sentry_flutter( 7120): at android.app.ActivityThread.main(ActivityThread.java:7924) E/MethodChannel#sentry_flutter( 7120): at java.lang.reflect.Method.invoke(Native Method) E/MethodChannel#sentry_flutter( 7120): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/MethodChannel#sentry_flutter( 7120): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) E/DartMessenger( 7120): Uncaught exception in binary message listener E/DartMessenger( 7120): java.lang.IllegalStateException: Reply already submitted E/DartMessenger( 7120): at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.java:431) E/DartMessenger( 7120): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:287) E/DartMessenger( 7120): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292) E/DartMessenger( 7120): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319) E/DartMessenger( 7120): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) E/DartMessenger( 7120): at android.os.Handler.handleCallback(Handler.java:942) E/DartMessenger( 7120): at android.os.Handler.dispatchMessage(Handler.java:99) E/DartMessenger( 7120): at android.os.Looper.loopOnce(Looper.java:201) E/DartMessenger( 7120): at android.os.Looper.loop(Looper.java:288) E/DartMessenger( 7120): at android.app.ActivityThread.main(ActivityThread.java:7924) E/DartMessenger( 7120): at java.lang.reflect.Method.invoke(Native Method) E/DartMessenger( 7120): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/DartMessenger( 7120): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) D/EGL_emulation( 7120): app_time_stats: avg=1.61ms min=0.59ms max=21.30ms count=32
当前配置代码
Future<void> main() async { await SentryFlutter.init( (options) { options.dsn = '<sentry_dns>'; // Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing. // We recommend adjusting this value in production. options.tracesSampleRate = 1.0; // The sampling rate for profiling is relative to tracesSampleRate // Setting to 1.0 will profile 100% of sampled transactions: options.profilesSampleRate = 1.0; }, appRunner: () => runApp(MultiProvider(providers: localProviders, child: const MyApp())), ); }
解决办法
1. 禁用自动App Start追踪(最快解决)
这个报错核心是Sentry的自动App Start追踪逻辑在调试环境(比如模拟器启动慢)下触发了MethodChannel重复回复的问题。直接在配置里关闭该功能即可:
修改后的配置代码:
Future<void> main() async { await SentryFlutter.init( (options) { options.dsn = '<sentry_dns>'; options.tracesSampleRate = 1.0; options.profilesSampleRate = 1.0; // 关闭自动App Start追踪,绕过报错逻辑 options.enableAutoAppStartTracking = false; }, appRunner: () => runApp(MultiProvider(providers: localProviders, child: const MyApp())), ); }
2. 升级sentry_flutter到最新稳定版
这个Reply already submitted的异常大概率是旧版本的已知bug,Sentry官方后续版本已经修复。执行以下命令升级:
flutter pub upgrade sentry_flutter
3. 优化应用启动速度
日志里的Invalid app start data: app start took too long (>60s)警告,说明你的应用启动耗时超过了Sentry的阈值。可以:
- 把非必要的初始化操作(比如某些第三方SDK初始化)移到应用启动后再执行
- 用真机测试,模拟器的启动速度通常比真机慢很多
- 检查
localProviders里是否有耗时的同步/异步操作,尽量延迟加载
内容的提问来源于stack exchange,提问作者Salvatore Calla'
相关产品推荐
相关产品推荐

