第2章 性能指标与监控工具:FPS、帧时长、响应延迟、CPU/内存开销、常用工具
Android 系统性能调优的第一步是建立可量化的评估体系。本章围绕 FPS、帧时长、响应延迟、CPU/内存开销 四大核心指标,讲解每个指标的定义、测量原理、常见阈值的意义,并给出 Systrace、Perfetto、dumpsys、top、Android Studio Profiler 等主流工具的搭配使用策略。理解这些指标与工具的关系,才能有的放矢地定位卡顿、掉帧、冗余计算等问题。
2.1 核心性能指标
| 指标 | 含义与单位 | 典型阈值 | 测量原理 |
|---|---|---|---|
| FPS | 每秒显示的帧数(帧/秒) | ≥60 fps 平滑 < 30 fps 明显卡顿 |
通过 Choreographer 回调或 SurfaceFlinger 合成统计 |
| 帧时长 | 单帧从绘制到合成完成的耗时(ms) | < 16.67 ms(60Hz) < 11.1 ms(90Hz) |
拆分为输入、动画、布局、绘制、合成各阶段 |
| 响应延迟 | 从用户输入到屏幕变化的时间(ms) | < 100 ms 感知流畅 200-500 ms 明显滞后 |
输入事件 → App 处理 → 渲染 → 显示 全链路耗时 |
| CPU/内存开销 | 进程 CPU 占用率、PSS/RSS 内存、GC 频率 | CPU 峰值< 70% 内存无持续增长 |
/proc 文件系统、dumpsys meminfo、top |
调优原则:优先优化帧时长,而非盲目追求 FPS。例如从 55 fps 提升到 60 fps 的难度远高于将帧时长从 20 ms 降到 16 ms。
2.2 常用监控工具
以下工具覆盖从系统级到应用级的监控需求,推荐按场景组合使用。
- Systrace / Perfetto:最底层的跟踪工具,可记录内核、SurfaceFlinger、App 线程的精准时间戳。用于分析帧时长拆分、同步等待、Binder 延迟。
- dumpsys gfxinfo:获取当前应用帧统计(过去 128 帧的绘制时间、掉帧数)。
adb shell dumpsys gfxinfo <PACKAGE> framestats可输出每帧详细阶段。 - top / dumpsys meminfo / procstat:实时查看 CPU 和内存使用。推荐
adb shell top -d 1 -o %CPU,THR,RES持续观察。 - Android Studio Profiler:图形化集成 CPU、内存、网络、能耗分析器。适合开发阶段快速定位热点。
- sysdump:系统级别的诊断工具,可收集堆栈、线程、Native 内存信息。
2.3 工具使用示例:获取 FPS 与帧时长
方式一:通过 adb shell dumpsys gfxinfo 获取帧统计
adb shell dumpsys gfxinfo com.example.app framestats
输出包含每帧的 Draw, Prepare, Process, Execute 耗时(单位为 ns)。真实帧时长 = 各阶段之和。最后一列 FrameCompleted 时间戳间隔可以计算 FPS。
方式二:使用 Perfetto 录制并查看帧时长
adb shell perfetto --txt -c /data/local/tmp/perfetto_config.pbtx -o /data/local/tmp/trace.perfetto-trace
adb pull /data/local/tmp/trace.perfetto-trace .
# 然后使用 https://ui.perfetto.dev 打开 .perfetto-trace 文件
Perfetto 配置示例(perfetto_config.pbtx):
buffers: {
size_kb: 204800
}
data_sources: {
config {
name: "android.surfaceflinger.frames"
target_buffer: 0
}
}
duration_ms: 5000
实战技巧:当发现某帧时长 >16.67 ms 时,在 Perfetto 中选中该帧,查看 Choreographer#doFrame 回调下的 App 线程堆栈,定位是布局、测量还是绘制方法耗时过高。
2.4 常见错误与避坑指南
| 错误认知 | 正确理解 |
|---|---|
| FPS=60 就一定流畅 | FPS 是平均值,可能存在周期性的长帧(jank)导致视觉卡顿 |
| 帧时长只关心总耗时 | 必须区分 GPU 等待(stalling)、CPU 绘制、Binder 同步等阶段 |
| CPU 占用低 = 性能优 | 可能因线程频繁休眠/唤醒导致帧时间长,CPU 低但功耗未优化 |
| 只用一种监控工具 | 需要组合 gfxinfo(帧统计)+ Perfetto(线程时间线)+ top(资源变化) |
2.5 性能优化原则
- 定义基准线:在目标设备上收集正常运行时的 FPS 分布、帧时长 P50/P95/P99、CPU 平均占用。
- 分级调优:先解决掉帧(帧时长 >16.67 ms),再优化 <11.1 ms(高刷屏)。
- 工具链标准化:在持续集成中集成
dumpsys gfxinfo脚本,记录每次提交的帧统计变化。 - 警惕“僵尸帧”:某些渲染管线会在无更新时重复提交同一帧,导致 FPS 虚高但实际无交互降帧。
重要提醒:不要在 Release 包中直接开启全量 Perfetto 跟踪(严重降低性能);应使用精简数据源或仅在挂载点采样。同样,生产环境中
dumpsys gfxinfo 的调用频率不应高于每秒 1 次。