「应用首帧耗时」的四类完整获取方式:
- 代码埋点法(Choreographer、FrameMetrics)
- logcat 抓取法(系统日志观察)
- SystemTrace 方式(Android Studio 自带)
- Perfetto 方式(Android 官方推荐)
一、代码埋点法(运行时统计)
方法一:Choreographer + onWindowFocusChanged(常用)
- 起点:Application.attachBaseContext();
- 终点:Activity.onWindowFocusChanged(true) + Choreographer.postFrameCallback;
- 用于业务埋点、自动追踪系统冷启动。
1 2 3 4
| Choreographer.getInstance().postFrameCallback { val cost = SystemClock.elapsedRealtime() - LaunchTimeMonitor.startTime Log.d("LaunchTime", "首帧耗时: \${cost}ms") }
|
方法二:FrameMetrics(高精度)
- 起点:Application.attachBaseContext();
- 终点:首帧 FrameMetrics.TOTAL_DURATION;
- 适合调试使用,记录每一帧耗时(API 24+)。
1 2 3 4
| window\.addOnFrameMetricsAvailableListener({ \_, metrics, \_ -> val totalNs = metrics.getMetric(FrameMetrics.TOTAL\_DURATION) Log.d("Launch", "首帧耗时: \${totalNs / 1\_000\_000}ms") }, Handler(Looper.getMainLooper()))
|
二、Logcat 抓取法(无需修改代码)
系统在启动 Activity 时,logcat 中会输出如下日志:
1
| ActivityTaskManager: Displayed com.xxx/.MainActivity: 1834ms
|
特点:
内容 |
值 |
Displayed |
表示 Activity 首帧完成 |
1834ms |
是系统从启动进程 ➜ 到首帧渲染完成的估算时间 |
来源 |
AMS(ActivityManagerService)日志 |
命令 |
`adb logcat |
示例命令:
1
| adb logcat | grep Displayed
|
三、System Trace(Android Studio)
操作步骤:
- 打开 Android Studio;
- Profiler > CPU > System Trace;
- 点击 App 图标,观察 timeline;
- 找到 “MainThread”、”ActivityThread”、”Choreographer#doFrame”、”Displayed” 等标记;
- 查看首个 Activity 的创建 → 绘制 → 渲染提交全过程。
优势:
- 精度高;
- 可分析 measure/layout/draw 各阶段;
- 支持启动过程全链路可视化。
四、Perfetto(Google 官方推荐)
简介:
Perfetto 是 Android 10+ 的官方高性能追踪工具,能精准展示:
- 应用启动全链路;
- 首帧时间;
- View 渲染耗时;
- Binder 调用;
- GPU 合成与提交时间。
使用方式:
1. 打开 Perfetto UI 工具:
2. 开启命令行抓取:
1 2
| adb shell perfetto -o /data/misc/perfetto-traces/trace.pb \ --txt -c /data/misc/perfetto-configs/startup_config.txt
|
或者用 Android Studio → Device Explorer > Perfetto 抓取。
3. 导入 trace 文件,搜索:
- “launching: com.xxx”
- “Displayed”
- “SurfaceFlinger”
- “Choreographer#doFrame”
优势:
- 系统级分析启动过程;
- 区分应用进程启动耗时、UI 绘制耗时;
- 可关联 CPU、GPU、内存等指标。
最终对比总结表
方式 |
精度 |
实时性 |
适用场景 |
是否修改代码 |
Choreographer |
中 |
✅ |
埋点上报 |
✅ |
FrameMetrics |
高 |
✅ |
调试分析 |
✅ |
Logcat: Displayed |
中 |
✅ |
快速验证 |
❌ |
SystemTrace |
高 |
❌ |
开发调优 |
❌ |
Perfetto |
极高 |
❌ |
系统分析 |
❌ |
推荐组合策略
场景 |
推荐方式 |
生产环境 |
Choreographer 埋点 + LaunchTimeMonitor |
开发调试 |
FrameMetrics + SystemTrace |
系统排查 |
Perfetto |
日常测试 |
`adb logcat |
上一篇:判断进程是否是主进程
下一篇:应用首帧耗时开始时间