Firebase Performance Monitoring 是 Google 提供的一款免费工具,用于实时跟踪移动应用程序的性能。该服务自动收集启动时间、屏幕渲染速度和 HTTP 请求持续时间的指标,无需为基本场景编写代码。根据 Google Firebase, 2025 的数据,SDK 无需额外配置即可自动跟踪高达 90% 的网络请求。该工具适用于 Android、iOS 和 Firebase 生态系统内的 Web 应用程序。
要点
Firebase Performance Monitoring 是 Google 的一项云服务,用于收集和显示移动应用程序的性能指标。该服务是 Firebase 工具集的一部分,无需单独付费——监控在免费 Spark 套餐(每天 500,000 个事件限制)和付费 Blaze 套餐中均可用。Firebase Performance 自动为标准场景生成跟踪:屏幕冷启动、热启动、后台 HTTP 请求。
该服务的架构基于两种数据类型:traces(跟踪)和 metrics(指标)。跟踪是一个有时间起点和终点的时间间隔,用于测量执行持续时间。指标是一个数值:响应大小、错误频率、速度(字节/秒)。每个跟踪可以包含多个指标。SDK 在设备上收集数据,进行缓冲,并以低延迟优先级在后台发送到 Firebase,以避免影响用户体验。
根据 Google I/O 2024 报告,Firebase Performance 在全球超过 200 万个应用程序中使用。如果配置了警报,使用 Firebase Performance 检测性能问题的平均时间为发布后 15 分钟。如果没有监控,类似问题平均需要 2-3 天才能根据用户向支持部门的投诉被发现。
Crashlytics 跟踪崩溃和致命错误——应用程序意外停止的情况。Firebase Performance 监控运行中应用程序的性能:慢速屏幕、长时间的网络请求、UI 响应延迟。Crashlytics 回答“应用程序为什么崩溃?”的问题,而 Performance 回答“应用程序为什么运行缓慢?”的问题。两个服务通过一个 SDK(Firebase Core)集成,数据在 Firebase 控制台的相关部分中显示。
Firebase Performance 不显示平均值——只显示 百分位数:P50、P75、P90、P95、P99。这对性能至关重要:平均时间会隐藏异常值。如果 99 个用户在 200 毫秒内打开屏幕,而一个用户需要 20 秒,平均值约为 400 毫秒,看起来可以接受。P99 将显示 20 秒——真正的问题。Firebase 在时间线上显示百分位数,可以精确到小时跟踪性能回归。
Firebase Performance SDK 通过标准集成方式集成到应用程序中:在 Gradle(Android)中添加依赖项或通过 CocoaPods(iOS)。在代码中初始化 Firebase 后,SDK 自动开始收集指标,无需额外配置。一个重要的工作原理是 延迟收集:SDK 不会立即发送数据,而是累积数据,并在网络条件有利时批量传输。
对于 iOS,SDK 使用 NSURLProtocol 拦截 HTTP 请求,对于 Android,使用 OkHttp Interceptor。如果应用程序不使用 OkHttp,SDK 会自动包装 HttpURLConnection。被拦截的请求会丰富元数据:Content-Type、响应状态、字节大小、持续时间。所有数据通过 HTTPS 使用 TLS 1.3 加密传输到 Firebase 服务器。
Firebase Performance 的关键要求之一是成为 Gradle 插件列表中的最后一个插件。如果顺序被打乱,SDK 可能无法拦截所有请求或无法正确测量启动时间。Firebase 建议将插件放在 plugins 块的末尾,在 Crashlytics 和其他 Google Services 插件之后。
// build.gradle (Module: app) — 插件的正确顺序
plugins {
id "com.android.application"
id "org.jetbrains.kotlin.android"
id "com.google.gms.google-services"
id "com.google.firebase.crashlytics"
id "com.google.firebase.firebase-perf" // 最后!
}
dependencies {
implementation platform("com.google.firebase:firebase-bom:33.0.0")
implementation "com.google.firebase:firebase-perf"
}
Firebase Performance 创建三种类型的自动跟踪:screen trace(屏幕渲染时间)、app start trace(应用程序启动时间)和 network request trace(HTTP 请求)。Android 的 screen trace 测量从 Activity.onCreate 调用到第一帧渲染完成之间的时间。对于 iOS,测量 viewDidLoad 和 viewDidAppear 之间的时间。Firebase 使用 Activity 或 ViewController 的类名自动为每个屏幕创建跟踪。
App start trace 分为两种类型:冷启动(应用程序从零开始启动,进程不存在)和热启动(应用程序从后台状态恢复)。冷启动是最关键的指标,因为它包括所有 SDK 的初始化、DEX 文件的加载和第一个 Activity 的创建。Firebase 从进程启动时刻到第一个屏幕完全渲染测量冷启动。根据 Google 的建议,冷启动的 P50 不应超过 500 毫秒,P99 不应超过 2 秒。
Network request trace 自动记录每个 HTTP 请求及其元数据:URL、方法、响应代码、响应大小、传输速度。在 Firebase Performance 控制台中,可以按 URL 模式过滤请求——例如,显示所有指向 /api/v2/orders 的请求。对于每个模式,显示响应时间的百分位数和 4xx/5xx 错误的频率。这使得无需配置单独的警报即可快速检测特定 API 的性能下降。
对于屏幕,Firebase Performance 还会计算 “frozen frames” 指标——渲染时间超过 700 毫秒的帧。这种 UI 冻结被用户感知为“应用程序卡住了”。如果屏幕上超过 1% 的 frozen frames,Firebase 将该指标标记为有问题。对于 Android,SDK 还会收集 slow renders 指标——超过 16 毫秒的帧(丢失 60 FPS)。Screen trace 和 frozen frames 的结合提供了加载时间和动画流畅度的完整画面。
自定义跟踪 允许测量任何用户场景的持续时间:下订单、上传图像到云、数据同步。开发者在代码中明确指定跟踪的起点和终点,并为场景命名。与自动跟踪不同,自定义跟踪可以完全控制测量内容,并允许添加属性进行过滤。
每个自定义跟踪可以包含 属性——作为元数据添加的键值对。属性有助于数据分段:例如,可以为 “promo_user” 和 “regular_user” 分别跟踪下订单时间。Firebase Performance 每个跟踪最多支持 5 个属性,每个属性最多支持 100 个唯一值。属性被索引,可在 Firebase 控制台中用于过滤。
根据 Google I/O 2024 报告,Spotify 团队使用 Firebase 自定义跟踪来监控曲目切换时间。这通过识别音频缓冲区缓存中的瓶颈,将中位切换时间从 400 毫秒减少到 120 毫秒。关键的发现是按 “device_model” 属性进行过滤——问题仅出现在 Android 13 的 Samsung 设备上。
import com.google.firebase.perf.FirebasePerformance
import com.google.firebase.perf.metrics.Trace
class CheckoutTracker {
private val firebasePerf = FirebasePerformance.getInstance()
fun trackCheckoutFlow(userId: String, promoApplied: Boolean) {
val trace: Trace = firebasePerf.newTrace("checkout_flow")
trace.putAttribute("promo_user", promoApplied.toString())
trace.putAttribute("user_tier", "premium")
trace.start()
// 执行下单场景
validateCart()
processPayment()
confirmOrder()
trace.stop()
}
}
将 Firebase Performance 集成到 Android 需要三个步骤:添加 google-services 插件、连接 Firebase BOM(Bill of Materials)以及添加 firebase-perf 依赖项。如果使用 AppCompatActivity,Firebase Performance 将自动在所有 Activity 和 Fragment 上运行。对于 Compose 屏幕,Firebase 建议使用自定义跟踪,因为自动 screen trace 不直接支持 Compose。
一个重要细节:Firebase Performance Gradle 插件在编译阶段修改应用程序的字节码。插件向每个 Activity 和 OkHttp 客户端添加检测代码。这可能会将构建时间增加 5-10%,APK 大小增加 200-400 KB。在调试构建中,Firebase Performance 会自动禁用——这可以防止在本地开发期间指标失真。要在调试中强制启用,请使用清单中的 firebasePerformanceInstrumentationEnabled 标志。
Firebase Performance 还支持 iOS 的 MetricKit 和 Android 的 Perfetto——低级别系统跟踪器。MetricKit 提供操作系统级别的帧率、CPU 和内存消耗数据。Firebase 聚合这些数据,并在显示 HTTP 跟踪和 screen trace 的同一控制台中显示,将系统和应用程序遥测数据结合在一个界面中。
import okhttp3.OkHttpClient
import com.google.firebase.perf.network.FirebasePerfOkHttpClient
val client = OkHttpClient.Builder()
.addInterceptor FirebasePerfOkHttpClient
.build()
val request = Request.Builder()
.url("https://api.example.com/orders")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) { /* handle */ }
override fun onResponse(call: Call, response: Response) { /* handle */ }
})
对于 iOS,Firebase Performance 的集成通过 CocoaPods 或 Swift Package Manager 完成。安装 FirebasePerformance 和 FirebaseCore pods 后,SDK 自动开始收集指标。为了拦截 HTTP 请求,Firebase Performance iOS 使用 NSURLProtocol——一种允许拦截应用程序中所有 URL 加载的系统机制。SDK 在启动时注册自己的 NSURLProtocol 子类,所有通过 URLSession 的请求自动受到监控。
iOS 的限制:Firebase Performance 不支持 SwiftUI 的自动 screen trace。对于 SwiftUI 应用程序,需要手动创建自定义跟踪,将 View 的主体包装在 start/stop 块中。Firebase 正在开发对 SwiftUI 的原生支持,但目前 SDK 仅自动跟踪 UIView 控制器。对于 UIKit + SwiftUI 的混合应用程序,建议在 UIKit 中创建屏幕,并通过 UIHostingController 嵌入 SwiftUI。
Firebase Performance iOS 还提供与 MetricKit——Apple 框架的集成,该框架在操作系统级别收集诊断数据。MetricKit 发送每日报告,包含 CPU、GPU、内存和帧率指标。Firebase Performance 聚合这些报告,并在控制台中与自定义跟踪一起显示,提供应用程序和系统级别的性能完整视图。
import FirebasePerformance
final class ImageUploadService {
func uploadImage(_ data: Data, to url: URL) async throws {
guard let trace = Performance.startTrace(name: "image_upload") else { return }
trace?.setValue("image/jpeg", forAttribute: "content_type")
trace?.setValue("\(data.count)", forAttribute: "file_size")
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = data
let (_, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse else { return }
trace?.setValue("\(httpResponse.statusCode)",
forAttribute: "status_code")
trace?.stop()
}
}
常见问题
是的,Firebase Performance 在 免费 Spark 套餐 中可用,每天限制 500,000 个事件。对于数据量较大的项目,使用 Blaze 套餐,按使用量付费:超出限制每 1000 个事件 0.0003 美元。对于大多数初创公司和中等规模的项目,每天 500,000 个事件已经足够。
Firebase Performance SDK 针对最小影响进行了优化。数据发送在 后台线程 中以低优先级进行。根据 Google 测试,SDK 对启动时间的影响小于 1%。SDK 大小约为 Android 300 KB,iOS 250 KB。
自动收集 app start(冷/热启动)、screen rendering(每个屏幕的渲染时间)、HTTP 请求(时间、大小、状态)和 frozen frames。对于 Android,还会收集 slow renders(>16 毫秒)的频率和 ANR。
Firebase Performance 在调试模式下自动禁用。要强制控制,请使用 Android 清单中的 firebasePerformanceInstrumentationEnabled 标志。对于 iOS,通过启动方案参数中的 -FIRPerformanceEnabled NO 标志进行禁用。
是的,Firebase Performance 支持导出到 BigQuery。项目连接到 BigQuery 后,所有指标自动复制到 BigQuery 表中,可用于 SQL 查询和在 Looker Studio 中创建仪表板。导出在 Firebase 控制台的 Integrations 部分进行配置。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。