Flutter发布模式下如何检测异常?排查Release构建崩溃问题
Flutter Release构建崩溃的排查方案
一、获取Release模式的异常日志
不管是Android还是iOS,都能拿到类似Debug模式的异常堆栈信息:
- Android端:
连接设备后,直接执行命令adb logcat -s Flutter实时抓取Flutter相关日志,崩溃时会输出完整的未捕获异常信息,包括堆栈跟踪,能直接定位到代码行。
也可以在代码里添加全局异常捕获,把日志写入本地文件,崩溃后导出查看:void main() { // 捕获Flutter框架层异常 FlutterError.onError = (details) { _saveErrorLog(details.exception.toString(), details.stack.toString()); FlutterError.presentError(details); }; // 捕获原生层未处理的异常 PlatformDispatcher.instance.onError = (error, stack) { _saveErrorLog(error.toString(), stack.toString()); return true; }; runApp(const MyApp()); } // 实现写入本地文件的方法,需依赖path_provider包 Future<void> _saveErrorLog(String exception, String stackTrace) async { final directory = await getExternalStorageDirectory(); final file = File('${directory?.path}/flutter_crash.log'); await file.writeAsString('${DateTime.now()}\nException: $exception\nStack Trace:\n$stackTrace\n\n', mode: FileMode.append); } - iOS端:
用Xcode打开项目,通过Window > Devices and Simulators选择你的设备,找到对应应用查看Console日志,崩溃时会输出详细的堆栈信息。同样也可以通过全局异常捕获把日志写入本地文件。
二、ProGuard规则排查
如果怀疑是ProGuard混淆导致的问题,可以按以下步骤排查:
- 先关闭ProGuard验证:在
android/app/build.gradle里把minifyEnabled改成false,打Release包运行,如果不再崩溃,就确定是混淆规则的问题。 - 添加基础Flutter混淆规则:
-keep class io.flutter.app.** { *; } -keep class io.flutter.plugin.** { *; } -keep class io.flutter.util.** { *; } -keep class io.flutter.view.** { *; } -keep class io.flutter.** { *; } -keep class io.flutter.plugins.** { *; } - 保留核心业务代码:如果项目里用到反射、MethodChannel的类,必须保留,比如:
-keep class com.yourproject.package.** { *; } // 替换成你的实际包名 - 补充第三方插件规则:使用的第三方插件如果需要混淆,官方文档一般都会给出对应的ProGuard规则,直接添加即可。
三、其他排查技巧
- 检查Release模式的tree shaking是否误删了必要代码,比如某些动态调用的方法,可以在
pubspec.yaml里调整相关构建配置,或者给关键代码添加@keep注解。
内容的提问来源于stack exchange,提问作者coolman
相关产品推荐
相关产品推荐

