SurfaceFlinger 核心工作机制解析
1. 启动入口与初始化流程
(1) 进程启动入口
- 二进制文件:
/system/bin/surfaceflinger
源码路径:frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
int main(int, char**) { // 1. 初始化进程配置 signal(SIGPIPE, SIG_IGN); startGraphicsAllocatorService(); // 启动图形内存分配服务 // 2. 创建 SurfaceFlinger 实例 auto factory = std::make_unique<android::impl::SurfaceFlingerFactory>(); auto flinger = factory->createSurfaceFlinger(); // 调用主构造函数 // 3. 注册为系统服务 flinger->init(); // 初始化 HAL 和 Display sp<IServiceManager> sm(defaultServiceManager()); sm->addService(String16("SurfaceFlinger"), flinger.get()); // 4. 进入主循环 flinger->run(); // 启动事件循环 return 0; }
(2) 构造函数调用链
// 主构造函数(实际业务入口)
SurfaceFlinger::SurfaceFlinger(Factory& factory)
: SurfaceFlinger(factory, SkipInitialization) { // 委托构造
// 动态配置加载(系统属性、调试开关等)
mSupportsWideColor = has_wide_color_display(false);
useHwcForRgbToYuv = force_hwc_copy_for_virtual_displays(false);
// ...
}
// 基础构造函数(仅成员初始化)
SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
: mFactory(factory),
mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)) {
// 最小化初始化(无业务逻辑)
}
2. 关键调用链路
(1) 帧合成流程(核心路径)
(2) 关键代码节点
阶段 | 代码路径 |
---|---|
Buffer 提交 | SurfaceFlinger::postComposition() → Layer::latchBuffer() |
合成策略决策 | SurfaceFlinger::doComposition() → HWComposer::createCompositionStrategy() |
HWC 交互 | HWComposer::validateDisplay() → IComposerClient::presentDisplay() |
显示输出 | DisplayDevice::present() → DRMAtomicCommit::commit() |
3. 与 Hardware 的联动机制
(1) 硬件抽象层(HAL)架构
**(2) 核心交互接口
-
HWC HAL 协议
- 接口定义:
- HIDL:
hardware/interfaces/graphics/composer/2.x/
- AIDL:
frameworks/hardware/interfaces/graphics/composer/
- HIDL:
- 关键操作:
// 查询硬件能力 hwc2_display_t display; mComposer->getDisplayCapabilities(display, &capabilities); // 提交合成结果 mComposer->presentDisplay(display, &presentFence);
- 接口定义:
-
Gralloc 内存管理
- 作用:管理图形缓冲区的分配/释放
- 调用路径:
BufferQueue::dequeueBuffer() → GrallocMapper::lock() → vendor.gralloc.allocator@x.x
-
DRM/KMS 驱动交互
- 厂商实现示例(高通):
// vendor/qcom/opensource/display-hal/hwc2/ComposerEngine.cpp bool ComposerEngine::presentDisplay(hwc2_display_t display) { mDrmManager.commitFrame(display); // 调用 DRM 提交帧 }
- 厂商实现示例(高通):