外观
SurfaceFlinger、HWC 与 SurfaceControl 各做什么?
标准回答
SurfaceFlinger 是系统合成服务,接收窗口等来源的图层内容与状态,组织最终屏幕画面。HWC,也就是 Hardware Composer,提供与显示硬件相关的合成能力。两者协商哪些图层可以由设备硬件处理,哪些需要客户端合成,再把结果交给显示链路。
因此不能把 SurfaceFlinger 理解为总是用 GPU 把所有层重新画一遍。具体合成方式受硬件能力、图层内容、变换和效果影响,可能混合使用不同路径。
SurfaceControl 更偏向图层控制,可通过相应事务设置位置、透明度、裁剪等状态。它与用于生产内容的 Surface 职责不同。改变图层位置可能只需更新图层状态,不一定要求应用把窗口内所有按钮重新绘制一次;但新的内容、尺寸适配和生命周期仍需各自正确处理。
关键机制
- WMS 管窗口策略与状态;SurfaceFlinger 处理合成,两者协作但不是同一个服务。
- 把相关属性放进同一事务有助于协调更新;事务提交不等于 GPU 已完成或像素已展示。
- 能否使用特定 SurfaceControl 能力取决于 API、权限和系统环境,系统项目经验不能直接套到普通应用。
通俗例子
跨屏过渡中,窗口内容不变而图层移动、alpha 渐变,可以主要改变图层状态;目标尺寸改变时,应用仍可能需要重新布局并生产适配后的内容。
追问与回答
系统图层动画能在应用主线程卡住时继续吗?
如果动画由独立的系统侧时序驱动,并且可以复用已有图层内容,就可能继续变化。但应用需要更新文字、布局或业务状态时,主线程阻塞仍会让内容停住。看到窗口还在移动,只能证明那段图层动画在推进,不能证明应用交互正常。
易混淆点
一个 Android View、一个应用窗口和一个系统合成图层并不存在通用的一对一关系。
参考资料
内容来源
- Android 技术札记 · 原条目
sf-composition