Android SurfaceFlinger核心工作机制

news2025/6/1 10:55:23

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) 帧合成流程(核心路径)
应用进程 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.coloradmin.cn/o/2392480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang|etcd服务注册与发现 策略模式

etcd 是一个开源的 分布式键值存储系统&#xff08;Key-Value Store&#xff09;&#xff0c;主要用于配置共享和服务发现。 ETCD是一个键值&#xff08;KV&#xff09;数据库&#xff0c;类似于Redis&#xff0c;支持分布式集群。ETCD也可以看作是一个分布式文件系统&#xff…

STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案

STM32的OLED显示程序亲测可用&#xff1a;适用于多种场景的稳定显示解决方案 【下载地址】STM32的OLED显示程序亲测可用 这是一套专为STM32设计的OLED显示程序&#xff0c;经过实际测试&#xff0c;运行稳定可靠。支持多种OLED屏幕尺寸和类型&#xff0c;提供丰富的显示效果&am…

【AI News | 20250529】每日AI进展

AI Repos 1、WebAgent 阿里巴巴通义实验室近日发布了WebDancer&#xff0c;一款旨在实现自主信息搜索的原生智能体搜索推理模型。WebDancer采用ReAct框架&#xff0c;通过分阶段训练范式&#xff0c;包括浏览数据构建、轨迹采样、监督微调和强化学习&#xff0c;赋予智能体自主…

Day12 - 计算机网络 - HTTP

HTTP常用状态码及含义&#xff1f; 301和302区别&#xff1f; 301&#xff1a;永久性移动&#xff0c;请求的资源已被永久移动到新位置。服务器返回此响应时&#xff0c;会返回新的资源地址。302&#xff1a;临时性性移动&#xff0c;服务器从另外的地址响应资源&#xff0c;但…

Linux驱动学习笔记(十)

热插拔 1.热插拔&#xff1a;就是带电插拔&#xff0c;即允许用户在不关闭系统&#xff0c;不切断电源的情况下拆卸或安装硬盘&#xff0c;板卡等设备。热插拔是内核和用户空间之间&#xff0c;通过调用用户空间程序实现交互来实现的&#xff0c;当内核发生了某种热拔插事件时…

TI dsp FSI (快速串行接口)

简介 快速串行接口&#xff08;FSI - Fast Serial Interface &#xff09;模块是一种串行通信外设&#xff0c;能够在隔离设备之间实现可靠的高速通信。在两个没有共同电源和接地连接的电子电路必须交换信息的情况下&#xff0c;电气隔离设备被使用。 虽然隔离设备促进了信号通…

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)

一、责任链模式核心概念解析 &#xff08;一&#xff09;模式定义与本质 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个处理者对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有某…

wechat-003-学习笔记

1.路由跳转页面&#xff1a;携带的参数会出现在onlaod中的options中。 注意&#xff1a;原生小程序对路由传参的长度也有限制&#xff0c;过长会被截掉。 2.wx.setNavigationBarTitle(Object object) 动态设置当前页面的标题 3.在根目录中的app.json文件中配置 后台播放音乐的能…

【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知

文章概要&#xff1a; 本文是一篇详细的技术教程&#xff0c;介绍如何使用魔搭社区&#xff08;ModelScope&#xff09;的GPU资源来进行LLaMA-Factory的模型微调。文章分为11个主要步骤&#xff0c;从环境准备到最终的模型测试&#xff0c;系统地介绍了整个微调流程。主要内容包…

【数据结构】哈希表的实现

文章目录 1. 哈希的介绍1.1 直接定址法1.2 哈希冲突1.3 负载因子1.4 哈希函数1.4.1 除法散列法/除留余数法1.4.2 乘法散列法1.4.3 全域散列法 1.5 处理哈希冲突1.5.1 开放地址法1.5.1.1 线性探测1.5.1.2 二次探测1.5.1.3 双重探测1.5.1.4 三种探测方法对比 1.6.3 链地址法 2. 哈…

永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器

一、基本原理 先给出IP速度控制器还是PI速度控制器的传递函数&#xff1a; PI调节器 IP调节器 从IP速度控制器还是PI速度控制器的传递函数可以看出&#xff0c;系统的抗负载转矩扰动能力相同,因此虽然采用IP速度控制器改善了转速环的超调问题&#xff0c;但仍然需要通过其他途…

RabbitMQ 应用 - SpringBoot

以下介绍的是基于 SpringBoot 的 RabbitMQ 开发介绍 Spring Spring AMQP RabbitMQ RabbitMQ tutorial - "Hello World!" | RabbitMQ 工程搭建步骤: 1.引入依赖 2.编写 yml 配置,配置基本信息 3.编写生产者代码 4.编写消费者代码 定义监听类,使用 RabbitListener…

基于递归思想的系统架构图自动化生成实践

文章目录 一、核心思想解析二、关键技术实现1. 动态布局算法2. 样式规范集成3. MCP服务封装三、典型应用场景四、最佳实践建议五、扩展方向一、核心思想解析 本系统通过递归算法实现了Markdown层级结构到PPTX架构图的自动转换,其核心设计思想包含两个维度: 数据结构递归:将…

OpenGL Chan视频学习-9 Index Buffers inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再单独整理网站具体函数了&#xff0c;网站直接翻译会…

Nginx安全防护与HTTPS部署实战

目录 前言一. 核心安全配置1. 隐藏版本号2. 限制危险请求方法3. 请求限制&#xff08;CC攻击防御&#xff09;&#xff08;1&#xff09;使用nginx的limit_req模块限制请求速率&#xff08;2&#xff09;压力测试验证 4. 防盗链 二. 高级防护1. 动态黑名单&#xff08;1&#x…

JAVA重症监护系统源码 ICU重症监护系统源码 智慧医院重症监护系统源码

智慧医院重症监护系统源码 ICU重症监护系统源码 开发语言&#xff1a;JavaVUE ICU护理记录&#xff1a;实现病人数据的自动采集&#xff0c;实时记录监护过程数据。支持主流厂家的监护仪、呼吸机等床旁数字化设备的数据采集。对接检验检查系统&#xff0c;实现自动化录入。喜…

python:机器学习(KNN算法)

本文目录&#xff1a; 一、K-近邻算法思想二、KNN的应用方式&#xff08; 一&#xff09;分类流程&#xff08;二&#xff09;回归流程 三、API介绍&#xff08;一&#xff09;分类预测操作&#xff08;二&#xff09;回归预测操作 四、距离度量方法&#xff08;一&#xff09;…

【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南

#工作记录 前言 在量化交易的学习探索中&#xff0c;偶然接触到 2017 年开源的 abu 量化交易库&#xff0c;其代码结构和思路对新手理解量化回测、指标分析等基础逻辑有一定参考价值。然而&#xff0c;当尝试在 2025 年的开发环境中部署这个久未更新的项目时&#xff0c;遇到…

小程序 - 视图与逻辑

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言: “心有多大,舞台就有多大。” 📚推荐学习: 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒T…

ChatGPT Plus/Pro 订阅教程(支持支付宝)

订阅 ChatGPT Plus GPT-4 最简单&#xff0c;成功率最高的方案 1. 登录 chat.openai.com 依次点击 Login &#xff0c;输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后&#xff0c;点击左下角的 Upgrade to Plus&#xff0c;在弹窗中选择 Upgrade plan。 如果…