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

Flutter Firebase Crashlytics上报Java栈而非Dart栈的配置问询

解决Flutter Crashlytics只显示Java堆栈、不输出Dart源码行号的问题

我之前也碰到过一模一样的坑,折腾了好一阵才捋顺,下面是亲测有效的解决方案:

1. 升级并修正Crashlytics初始化代码

你当前用的是旧版API(Crashlytics.instance),现在firebase_crashlytics包已经更新了API,旧写法可能导致Dart错误捕获不完整。替换成新版初始化逻辑:

import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';

void main() async {
  // 必须先初始化Flutter绑定
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化Firebase核心
  await Firebase.initializeApp();

  // 捕获Flutter框架抛出的同步错误
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;

  // 捕获异步代码中的错误(比如Future、Stream里的异常)
  runZonedGuarded(() {
    runApp(AppMain(homeWidget));
  }, (error, stackTrace) {
    FirebaseCrashlytics.instance.recordError(error, stackTrace);
  });
}

2. 确保符号文件正确上传到Firebase

这是核心!没有符号文件,Crashlytics没法把原始堆栈解析成Dart源码的文件名和行号。

iOS端配置

  • 打开Xcode,进入项目Target → Build Settings:
    • 找到Debug Information Format,确保Release模式下设置为DWARF with dSYM File;
  • 进入Build Phases,添加一个Run Script,内容为:
"${PODS_ROOT}/FirebaseCrashlytics/run"

勾选Run script only when installing,避免debug模式下重复执行。

Android端配置

  • 在android/app/build.gradle中,给Release构建添加符号上传配置:
android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            
            // 开启Crashlytics符号上传
            firebaseCrashlytics {
                mappingFileUploadEnabled true
                nativeSymbolUploadEnabled true
            }
        }
    }
}
  • 在proguard-rules.pro中添加保护Dart符号的规则,避免混淆移除关键信息:
-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.**  { *; }

3. 测试验证

主动抛出一个Dart错误来验证效果:

// 在某个按钮点击事件里添加测试代码
ElevatedButton(
  onPressed: () {
    throw Exception("测试Dart错误上报");
  },
  child: const Text("触发测试错误"),
)

编译成Release版本安装到设备,触发错误后等待5-10分钟(Crashlytics上报有延迟),再去Firebase控制台查看错误详情,就能看到包含.dart文件名、方法名和行号的完整Dart堆栈了。

关于Crashlytics对Dart源码行号的支持

答案是完全支持!只要符号文件上传正确、初始化配置无误,Crashlytics会自动解析Dart堆栈,显示和本地调试时一致的源码位置信息,定位问题非常方便。


内容的提问来源于stack exchange,提问作者Shirish Kadam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:24:12