第2章 性能指标与监控工具:FPS、帧时长、响应延迟、CPU/内存开销、常用工具

Android 系统性能调优的第一步是建立可量化的评估体系。本章围绕 FPS、帧时长、响应延迟、CPU/内存开销 四大核心指标,讲解每个指标的定义、测量原理、常见阈值的意义,并给出 Systrace、Perfetto、dumpsys、top、Android Studio Profiler 等主流工具的搭配使用策略。理解这些指标与工具的关系,才能有的放矢地定位卡顿、掉帧、冗余计算等问题。

性能指标与监控工具映射关系 FPS 帧率 帧时长 Frame Time 响应延迟 Latency CPU/内存 资源开销 Systrace / Perfetto dumpsys top / procstat AS Profiler adb shell perfetto --txt -c /config.pbtx adb shell dumpsys gfxinfo <pkg> adb shell top -d 1 adb shell cat /proc/meminfo 提示:FPS 与帧时长并非倒数关系 帧时长关注单帧绘制耗时,FPS 统计单位秒内帧数,两者需结合分析

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 性能优化原则

  1. 定义基准线:在目标设备上收集正常运行时的 FPS 分布、帧时长 P50/P95/P99、CPU 平均占用。
  2. 分级调优:先解决掉帧(帧时长 >16.67 ms),再优化 <11.1 ms(高刷屏)。
  3. 工具链标准化:在持续集成中集成 dumpsys gfxinfo 脚本,记录每次提交的帧统计变化。
  4. 警惕“僵尸帧”:某些渲染管线会在无更新时重复提交同一帧,导致 FPS 虚高但实际无交互降帧。
重要提醒:不要在 Release 包中直接开启全量 Perfetto 跟踪(严重降低性能);应使用精简数据源或仅在挂载点采样。同样,生产环境中 dumpsys gfxinfo 的调用频率不应高于每秒 1 次。