Flutter应用使用Crashlytics时能否获取Dart代码的错误位置
Flutter Crashlytics 无Dart层堆栈排查方案
核心原因说明
你当前测试使用的FirebaseCrashlytics.instance.crash()是原生层崩溃触发接口,本身就会直接终止原生进程,不会生成Dart侧调用堆栈,所以只会返回Java/ObjC层的栈信息,这是预期表现。如果要测试Dart异常捕获能力,需要主动抛出Dart侧异常,比如throw Exception("Test Dart crash");。
如果主动抛出Dart异常后还是看不到对应文件名和行号,一般是遗漏了如下配置:
1. 符号上传配置检查
Android端
- 项目根目录
android/build.gradle中添加Crashlytics Gradle插件依赖:dependencies { // 替换为最新稳定版即可 classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' } - app级目录
android/app/build.gradle顶部引入插件,同时开启符号上传:apply plugin: 'com.google.firebase.crashlytics' android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 开启原生和Flutter符号上传 firebaseCrashlytics { nativeSymbolUploadEnabled true uploadNativeSymbols true } } } }
iOS端
- 打开Xcode项目,在构建阶段(Build Phases)添加新的运行脚本(Run Script),脚本内容填写:
"${PODS_ROOT}/FirebaseCrashlytics/run" - 输入文件路径添加两项:
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
2. 全局异常捕获配置
Crashlytics默认不会自动捕获所有Dart层异常,需要在main函数中手动配置全局捕获逻辑:
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 捕获Dart同步异常 FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; // 捕获Dart异步异常 PlatformDispatcher.instance.onError = (error, stack) { FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); return true; }; runApp(MyApp()); }
3. 打包测试注意事项
- Debug模式下Crashlytics默认不上报崩溃,所有测试请在Release或Profile模式下进行
- 如果打包时使用了
--split-debug-info参数,需要手动将生成的符号文件上传到Firebase控制台,否则也会出现无法解析行号的问题
内容的提问来源于stack exchange,提问作者Agung
相关产品推荐
相关产品推荐

