第三方崩溃捕获框架对比
刚开始做启动阶段崩溃优化时,我总想着自己写个捕获模块。后来踩了不少坑——信号处理要兼容多平台、日志写文件还得考虑磁盘空间、上报时机不对又丢数据……嗯,最后老老实实引入第三方框架。这节咱们把市面上主流的四个选手拉出来溜溜:Crashlytics、Sentry、Bugly、KSCrash。我会结合自己在实际项目中的体会,帮你快速选出最适合启动场景的方案。
Crashlytics(Firebase)
Google 亲儿子,集成在 Firebase 生态里。你可以理解为它把「捕获—存储—分析—报警」做成了一站式服务。我最早在 Android 上用,后来在 iOS 项目里也试过,感觉最爽的是它自动关联用户行为流——比如用户崩溃前点了哪个按钮,不用你自己打埋点。
不过,启动阶段要注意它的初始化过程。Crashlytics 默认会在 main 线程做网络配置检查,如果你的网络环境差,启动可能卡几百毫秒。我建议把初始化放到后台线程,或者用 delayUntilFirstCrash 模式(仅 Android 支持)。另外,国内要翻墙才能走通 Firebase 服务,如果你面向国内用户,这点很要命。
Crashlytics.crashlytics().setCustomLog("app_launch_start") 记录启动时间戳,配合 Firebase 的启动跟踪,能精准定位启动阶段独有的崩溃。
Sentry
Sentry 走的是「开源 + 自托管 / SaaS」路线。我个人很喜欢它的灵活性——你可以部署在自己的服务器上,数据不出公司。Sentry 对移动端的支持很完整,有 SDK 采集 native 崩溃,也能捕获 Dart(Flutter)异常。
但坑也不少。我曾经在集成时忘了配置 sendDefaultPII,结果用户 IP 全被当成 crash tag 上传了,烦了好一阵子。启动阶段,Sentry 的 SDK 默认会 Hook 系统的 exception handler,如果你的 App 在其他地方也注册了 handler,可能出现冲突,导致崩溃日志重复或丢失。解决方案是使用 setIntegrations 控制加载顺序。
Bugly
腾讯出品,国内 App 的首选。Bugly 的接入成本很低,你只要把 jar 包(或 pod)加上,调用 Bugly.init(getApplicationContext()) 就能用。它把符号表(dSYM)自动上传、按版本/机型筛选都做得挺顺手。
我印象最深的是,Bugly 在启动阶段的初始化几乎无感——它甚至没有 initSync 阻塞调用,所有日志写入都是异步的。不过,它能捕获的崩溃类型有限。比如 Mach Exception 和 BSD Signal 的深度 hook 不如 KSCrash 那么底层。如果你需要捕获 SIGSEGV 死锁之类的高危信号,Bugly 可能漏报。另外,Bugly 的 Web 控制台有时会丢数据,我遇到过 10% 的崩溃报表显示为“0”,排查了半天发现是服务端聚合超时。
KSCrash
KSCrash 是个轻量级的 C 层框架,没有花哨的控制台,只做一件事——捕获并持久化崩溃。它在 iOS / macOS 上尤其强大,能捕获 Mach 异常和 BSD 信号。我早期做越狱检测 SDK 时就用它改的二次开发框架。
启动阶段,KSCrash 的初始化几乎不耗时间,因为它只是注册几个回调函数,不做网络 IO。但它不提供上报功能,你得自己写个任务队列在启动完成后把日志上传。另外,KSCrash 的回调是同步的,如果你在回调里做耗时操作,会影响 crash 后的重启速度。我曾经在回调里写文件,遇到写满磁盘导致 App 无法重开的惨案……后来改成先写到内存 buffer 再定时 flush。
| 维度 | Crashlytics | Sentry | Bugly | KSCrash |
|---|---|---|---|---|
| 启动影响 | 中(可能阻塞主线程) | 低(异步 hook) | 极低(纯异步) | 极低(仅注册回调) |
| 平台覆盖 | iOS / Android / Web | 全平台(含 Flutter) | iOS / Android | iOS / macOS(有 Android 分支) |
| 国内可用性 | 需翻墙 | 自托管无限制 | 原生支持 | 无限制 |
| 上报能力 | 内置 | 内置 | 内置 | 需要自己实现 |
| 头部崩溃捕获深度 | 一般(依赖系统 API) | 较好 | 中等 | 优秀(Mach + Signal) |
| 社区活跃度 | 高 | 很高 | 中等 | 低(维护停滞) |
总结几句心里话
框架选型没有银弹。我个人会按这个优先级来权衡:
- 启动速度第一 → 排除 Crashlytics(除非你能接受异步初始化),Bugly 或 KSCrash 是首选。
- 功能完整度 → Sentry 和 Crashlytics 的堆栈分析、用户行为采集更完善。
- 数据合规 → Sentry 自托管、KSCrash 自定义上传最灵活。
SIGABRT,排查到最后发现是 Bugly 自身 hook 了 abort() 导致信号错乱。后来我在初始化时加了一条过滤规则,只保留主线程的崩溃,才恢复正常。建议无论用哪个框架,上线前都做一轮白盒开关测试——手动触发内存坏写、空指针、信号崩溃,看看日志是否完整、符号表是否正确,这一步千万别省。