Firebase vs Supabase
Google全面的移动开发平台Firebase,对阵开源PostgreSQL替代方案Supabase。在选择后端即服务(BaaS)时该如何取舍?
谷歌推出的免费、轻量级崩溃监控 SDK
错误监控 + 性能 + 会话回放整合于同一平台,且可自托管
简单的判断标准:如果你只想知道「应用什么时候崩溃」且预算为零,选 Crashlytics——安装只需几分钟,也没有账单风险。如果你需要在同一面板中获得错误+性能+会话回放,或者出于合规要求必须把数据留在自有基础设施上,Sentry 的功能范围值得这份成本。不少团队会同时使用两者;如果你打算这么做,务必在自己的构建中实测双 SDK 对应用体积和启动时间的影响。
| 分类 | Firebase Crashlytics | Sentry |
|---|---|---|
| 性能 | 7/10 | 9/10 |
| 学习难易度 | 9/10 | 6/10 |
| 生态系统 | 6/10 | 9/10 |
| 社区 | 8/10 | 8/10 |
| 就业市场 | 6/10 | 7/10 |
| 面向未来 | 7/10 | 8/10 |
// Firebase Crashlytics - Android(Kotlin)安装与非致命日志记录
// build.gradle.kts (app)
// plugins { id("com.google.gms.google-services"); id("com.google.firebase.crashlytics") }
// dependencies { implementation(platform("com.google.firebase:firebase-bom:34.19.0"))
// implementation("com.google.firebase:firebase-crashlytics") }
import com.google.firebase.Firebase
import com.google.firebase.crashlytics.crashlytics
import com.google.firebase.crashlytics.setCustomKeys
class CheckoutViewModel {
private val crashlytics = Firebase.crashlytics
fun onPaymentStarted(orderId: String, amount: Double) {
// Breadcrumb:记录操作步骤,便于崩溃时定位所处阶段
crashlytics.log("payment_started order=$orderId amount=$amount")
crashlytics.setCustomKeys {
key("order_id", orderId)
key("payment_amount", amount)
key("user_tier", "premium")
}
}
fun onPaymentFailed(error: Throwable, orderId: String) {
// 不使程序崩溃,仅记录错误(non-fatal)
crashlytics.setCustomKey("order_id", orderId)
crashlytics.recordException(error)
}
fun identifyUser(userId: String) {
crashlytics.setUserId(userId)
}
}
// AndroidManifest.xml:firebase_crashlytics_collection_enabled=false(获得用户同意后再开启)
// Runtime:Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)// Sentry - iOS(Swift):单一 SDK 集成错误 + 性能 + 会话回放
// Package.swift / SPM: https://github.com/getsentry/sentry-cocoa
import Sentry
func configureSentry() {
SentrySDK.start { options in
options.dsn = "https://<public-key>@o<org-id>.ingest.sentry.io/<project-id>"
options.debug = false
// 性能追踪
options.tracesSampleRate = 0.2
// UI Profiling(sentry-cocoa 9.x):绑定到 trace 生命周期
options.configureProfiling = {
$0.lifecycle = .trace
$0.sessionSampleRate = 1.0
}
// Session Replay:记录崩溃前的界面操作流程
options.sessionReplay.onErrorSampleRate = 1.0
options.sessionReplay.sessionSampleRate = 0.1
// 出错时自动附加截图 + 视图层级信息
options.attachScreenshot = true
options.attachViewHierarchy = true
}
}
// Breadcrumb + 自定义上下文 + 非致命错误捕获
func onPaymentFailed(_ error: Error, orderId: String) {
let crumb = Breadcrumb(level: .error, category: "payment")
crumb.message = "payment_failed order=\(orderId)"
SentrySDK.addBreadcrumb(crumb)
SentrySDK.configureScope { scope in
scope.setTag(value: orderId, key: "order_id")
scope.setUser(User(userId: "u_123"))
}
SentrySDK.capture(error: error)
}
// dSYM 自动上传(Xcode Run Script Build Phase):
// sentry-cli debug-files upload --include-sources "$DWARF_DSYM_FOLDER_PATH"简单的判断标准:如果你只想知道「应用什么时候崩溃」且预算为零,选 Crashlytics——安装只需几分钟,也没有账单风险。如果你需要在同一面板中获得错误+性能+会话回放,或者出于合规要求必须把数据留在自有基础设施上,Sentry 的功能范围值得这份成本。不少团队会同时使用两者;如果你打算这么做,务必在自己的构建中实测双 SDK 对应用体积和启动时间的影响。
获取免费咨询如果只需要崩溃追踪且预算必须为零,选 Crashlytics;如果团队还需要性能追踪、会话回放,或有自托管需求,Sentry 是更合适的选择。两者的 SDK 都易于安装,最终取决于功能范围和预算这两个问题。