Systrace 工具分析SurfaceFlinger

185 阅读2分钟

这篇文章主要讲了 Android 系统中 SurfaceFlinger 的工作原理,以及如何通过 Systrace 工具分析其性能。下面用通俗的话来解释:

一、SurfaceFlinger:手机屏幕的 “画家导演”

SurfaceFlinger 是 Android 系统里专门负责 “画屏幕” 的核心服务,它的工作就像一个导演兼画家:

  • 收集画面:各个应用(如微信、游戏)各自画好自己的界面 “图层”,SurfaceFlinger 把这些图层收集起来。
  • 合成显示:把所有图层按顺序叠在一起(比如状态栏在最上面,应用界面在中间),然后显示到屏幕上。
  • 同步刷新:屏幕每秒刷新约 60 次(VSYNC 信号),SurfaceFlinger 必须在每次刷新前准备好所有图层,否则会出现画面撕裂或卡顿。

二、Systrace:给系统拍 “慢动作视频” 的工具

Systrace 能记录系统各部分的工作时间线,像慢动作视频一样展示:

  1. App 部分:应用如何准备画面

    • 应用收到 VSYNC 信号(“开始画画” 的指令)后,主线程和渲染线程开始绘制界面,完成后把画面存入 “BufferQueue”(类似排队的画稿)。
  2. BufferQueue:画面的 “排队等候区”

    • 应用画好的画面先存在这里,SurfaceFlinger 按顺序取走合成。如果队列空了或应用没及时放新画稿,就会导致无画面可显示(掉帧)。
  3. SurfaceFlinger 部分:合成画面的核心流程

    • 收到 VSYNC 信号后,SurfaceFlinger 遍历所有图层,从 BufferQueue 取最新画稿,然后询问硬件合成器(HWComposer)如何高效显示。
    • 关键步骤:准备图层 → 计算合成方式 → 执行合成 → 发送到屏幕。
  4. HWComposer:硬件层面的 “优化大师”

    • 决定如何用硬件(如 GPU)高效合成画面,比如直接叠加图层(省电)或用 GPU 渲染(灵活但耗电)。

三、如何通过 Systrace 判断卡顿?

卡顿通常是因为某一步骤耗时过长:

  1. 查看 SurfaceFlinger 是否收到 VSYNC 信号但没合成

    • 可能原因:App 没及时把画稿放入 BufferQueue(应用卡顿),或 SurfaceFlinger 被其他任务(如截图)占用。
  2. 查看 BufferQueue 中的画稿数量

    • 如果队列空了,说明应用没画好;如果队列满了,说明 SurfaceFlinger 合成太慢。
  3. 查看硬件合成器(HWComposer)的耗时

    • 若 HWComposer 处理慢,可能是硬件性能不足或图层太多。

四、总结:SurfaceFlinger 的工作链

plaintext

应用绘制画面 → 放入BufferQueue排队 → SurfaceFlinger取画稿合成 → HWComposer优化显示 → 屏幕刷新

Systrace 就像这个过程的 “监控摄像头”,通过分析各环节的时间线(如 VSYNC 信号间隔、BufferQueue 状态、合成耗时),能精准定位卡顿原因,帮助开发者优化性能。