当前位置: 首页 > article >正文

Android SurfaceFlinger核心工作机制

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 和 Displaysp<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) 帧合成流程(核心路径)
应用进程 SurfaceFlinger Hardware Composer DRM/KMS驱动 GPU dequeueBuffer() / queueBuffer() 收集所有 Layer 的 Buffer validateDisplay() + presentDisplay() 返回部分合成结果 调用 OpenGL ES 合成剩余 Layer 通过 KMS 提交帧到显示 alt [使用 GPU 合成] [全硬件合成] 通知释放 Buffer 应用进程 SurfaceFlinger Hardware Composer DRM/KMS驱动 GPU
(2) 关键代码节点
阶段代码路径
Buffer 提交SurfaceFlinger::postComposition()Layer::latchBuffer()
合成策略决策SurfaceFlinger::doComposition()HWComposer::createCompositionStrategy()
HWC 交互HWComposer::validateDisplay()IComposerClient::presentDisplay()
显示输出DisplayDevice::present()DRMAtomicCommit::commit()

3. 与 Hardware 的联动机制

(1) 硬件抽象层(HAL)架构
HIDL/AIDL
SurfaceFlinger
HWC HAL
厂商实现
DRM/KMS
GPU Driver
**(2) 核心交互接口
  1. HWC HAL 协议

    • 接口定义
      • HIDL: hardware/interfaces/graphics/composer/2.x/
      • AIDL: frameworks/hardware/interfaces/graphics/composer/
    • 关键操作
      // 查询硬件能力
      hwc2_display_t display;
      mComposer->getDisplayCapabilities(display, &capabilities);// 提交合成结果
      mComposer->presentDisplay(display, &presentFence);
      
  2. Gralloc 内存管理

    • 作用:管理图形缓冲区的分配/释放
    • 调用路径
      BufferQueue::dequeueBuffer()GrallocMapper::lock() → vendor.gralloc.allocator@x.x
      
  3. DRM/KMS 驱动交互

    • 厂商实现示例(高通):
      // vendor/qcom/opensource/display-hal/hwc2/ComposerEngine.cpp
      bool ComposerEngine::presentDisplay(hwc2_display_t display) {mDrmManager.commitFrame(display); // 调用 DRM 提交帧
      }
      
http://www.lryc.cn/news/2392480.html

相关文章:

  • Golang|etcd服务注册与发现 策略模式
  • 深度解析UniApp盲盒系统开发:从源码架构到多端部署全流程
  • STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案
  • 【AI News | 20250529】每日AI进展
  • Day12 - 计算机网络 - HTTP
  • Linux驱动学习笔记(十)
  • 如何优化Elasticsearch的搜索性能?
  • TI dsp FSI (快速串行接口)
  • 责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)
  • nlp中的频率就是权重吗
  • 融智学“新五常”框架:五维方式的重构与协同
  • wechat-003-学习笔记
  • 【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知
  • 基于MATLAB编程针对NCV检测数据去漂移任务的完整解决方案
  • 【数据结构】哈希表的实现
  • 永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器
  • RabbitMQ 应用 - SpringBoot
  • 基于递归思想的系统架构图自动化生成实践
  • OpenGL Chan视频学习-9 Index Buffers inOpenGL
  • 《基于AIGC的智能化多栈开发新模式》研究报告重磅发布! ——AI重塑软件工程,多栈开发引领未来
  • 热门大型语言模型(LLM)应用开发框架
  • Nginx安全防护与HTTPS部署实战
  • JAVA重症监护系统源码 ICU重症监护系统源码 智慧医院重症监护系统源码
  • 静态资源js,css免费CDN服务比较
  • 组合型回溯+剪枝
  • python:机器学习(KNN算法)
  • 【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
  • 小程序 - 视图与逻辑
  • ChatGPT Plus/Pro 订阅教程(支持支付宝)
  • [蓝帽杯 2022 初赛]网站取证_2