hwc2 surfaceflinger启动流程分析

本文详细分析了Android系统中SurfaceFlinger如何通过HWComposer加载HWC2服务,并深入到HAL层的启动流程,包括SurfaceFlinger的init、HWComposer的构造、loadHwcModule、Composer的创建、registerCallback、[email protected]的加载,以及HAL层的HWCSession初始化和内核通信机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先还是大体的来看下流程图,这个比hwc1复杂了好多,不是太好理解:
在这里插入图片描述

1.SurfaceFlinger.init

        "Starting with vr flinger active is not currently supported.");
    mRealHwc = new HWComposer(false);
    mHwc = mRealHwc;
    mHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this));

    Mutex::Autolock _l(mStateLock);

在这里只关注hwcomposer实例生成的具体过程,上面代码主要二个作用:
1.生成一个HWComposer实例
2.生成实例后,注意消息回调函数。是surfaceflinger与composer Hidl服务层通信的唯一通道

2.HWComposer

HWComposer::HWComposer(bool useVrComposer)
    : mHwcDevice(),
      mDisplayData(2),
      mFreeDisplaySlots(),
      mHwcDisplaySlots(),
      mCBContext(),
      mEventHandler(nullptr),
      mVSyncCounts(),
      mRemainingHwcVirtualDisplays(0)
{
   
   
    for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) {
   
   
        mLastHwVSync[i] = 0;
        mVSyncCounts[i] = 0;
    }

    loadHwcModule(useVrComposer);
}

来看看其构造函数,除了初始化一些基本的成员变量。剩下的就是loadHwcModule这个API的调用了,这个调用就是获取hwc2的实例

3.loadHwcModule

文件:HWComposer.cpp

void HWComposer::loadHwcModule(bool useVrComposer)
{
   
   
    ALOGV("loadHwcModule");
    //获取HWC2::Device类实例,这是这个函数的唯一作用
    mHwcDevice = std::make_unique<HWC2::Device>(useVrComposer);
    mRemainingHwcVirtualDisplays = mHwcDevice->getMaxVirtualDisplayCount();
}

4.HWC2::Device

文件:hwc2.cpp

Device::Device(bool useVrComposer)
  : mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)),
    mCapabilities(),
    mDisplays(),
    mHotplug(),
    mPendingHotplugs(),
    mRefresh(),
    mPendingRefreshes(),
    mVsync(),
    mPendingVsyncs()
{
   
   
    loadCapabilities();
    registerCallbacks();
}

这个函数比较重要的有二个:
1.mComposer成员的初始化
2.向composer HIDL服务注册回调函数registerCallbacks

5.Composer

文件:ComposerHal.cpp

Composer::Composer(bool useVrComposer)
    : mWriter(kWriterInitialSize),
      mIsUsingVrComposer(useVrComposer)
{
   
   
    if (mIsUsingVrComposer) {
   
   
        mComposer = IComposer::getService("vr");
    } else {
   
   
        mComposer = IComposer::getService(); // use default name
    }

    if (mComposer == nullptr) {
   
   
        LOG_ALWAYS_FATAL("failed to get hwcomposer service");
    }

    mComposer->createClient(
            [&](const auto& tmpError, const auto& tmpClient)
            {
   
   
                if (tmpError == Error::NONE) {
   
   
                    mClient = tmpClient;
                }
            });
    if (mClient 
<think>首先,用户的问题是:“我想了解Android系统中SurfaceFlinger启动流程 请问Android SurfaceFlinger 启动流程详解”。我需要根据系统级指令来构建我的回答。 系统级指令: 1. 所有行内数学表达式必须使用 $...$ 格式。但在这个问题中,似乎没有数学表达式,所以可能不需要。 2. 独立公式必须使用 $$...$$ 格式并单独成段。同样,可能不适用。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用了几个关于SurfaceFlinger的片段,我需要参考这些来构建我的回答。这些引用提供了SurfaceFlinger启动流程信息。 从引用中提取关键信息: - 引用[1]:提到了SurfaceFlinger启动,包括服务启动配置文件:/frameworks/native/services/surfaceflinger/surfaceflinger.rc。还提到了Surface创建过程。 - 引用[2]:SurfaceFlinger的设计目标,但启动流程较少。 - 引用[3]:显示了createSurfaceFlinger函数的代码,这是创建SurfaceFlinger实例的地方。 - 引用[4]:提到了App进程中创建Surface的过程,但这是客户端视角,不是启动流程。 - 引用[5]:讨论了SurfaceFlinger的渲染流程,但启动流程较少。 核心启动流程: - SurfaceFlinger是Android显示系统的核心服务,它在系统启动时由init进程启动。 - 启动流程涉及: 1. init进程解析surfaceflinger.rc文件。 2. 启动surfaceflinger服务。 3. SurfaceFlinger的main函数被调用。 4. 创建SurfaceFlinger实例。 5. 初始化硬件层、显示设备等。 基于引用[3],代码片段显示了createSurfaceFlinger函数,它在SurfaceFlingerFactory.cpp中定义。 我需要构建一个结构清晰的回答: 1. 介绍SurfaceFlinger的作用。 2. 详细描述启动流程步骤。 3. 使用自然的中文。 4. 在引用的地方添加引用标识。 5. 结尾生成相关问题。 回答结构: - 开头:简要介绍SurfaceFlinger。 - 主体:逐步解释启动流程,参考引用信息。 - 结尾:总结并生成相关问题。 确保引用正确: - 例如,提到surfaceflinger.rc时引用[1]。 - 提到createSurfaceFlinger函数时引用[3]。 启动流程步骤: 1. 系统启动时,init进程启动2. init进程解析surfaceflinger.rc文件(引用[1])。 3. 启动surfaceflinger服务。 4. SurfaceFlinger的main函数在main_surfaceflinger.cpp中被调用。 5. 在main函数中,创建SurfaceFlinger实例(引用[3])。 6. 初始化过程:设置硬件、注册服务等。 7. SurfaceFlinger开始处理显示合成。 其他细节: - SurfaceFlinger作为系统服务运行。 - 它处理图层合成和帧缓冲。 生成相关问题: - 基于主题,生成3-5个相关问题。 - 例如: 1. SurfaceFlinger如何处理图层合成? 2. SurfaceFlinger的优化方法有哪些? 3. SurfaceFlinger在Android系统中的作用是什么? 4. 如何调试SurfaceFlinger相关问题? 使用中文回答。</think>### Android SurfaceFlinger 启动流程详解 SurfaceFlinger 是 Android 显示系统的核心服务,负责管理图形缓冲区、合成图层,并将最终图像渲染到显示设备。它在系统启动过程中由 init 进程启动,确保系统 UI 和应用窗口能正常显示。下面我将逐步解析 SurfaceFlinger启动流程,基于 Android 源码(以 Android 11 为例)和相关文档,确保内容真实可靠。 #### 1. **系统启动阶段:init 进程加载服务配置** - Android 系统启动时,init 进程(第一个用户空间进程)负责解析服务配置文件。SurfaceFlinger 的服务定义在 `/frameworks/native/services/surfaceflinger/surfaceflinger.rc` 文件中。该文件指定了服务名称、可执行文件路径和启动参数。例如: ``` service surfaceflinger /system/bin/surfaceflinger class core animation user system group graphics drmrpc capabilities SYS_NICE onrestart restart zygote ``` init 进程根据此配置启动 surfaceflinger 服务,并设置必要的权限和资源限制[^1]。 #### 2. **SurfaceFlinger 可执行文件启动** - init 进程执行 `/system/bin/surfaceflinger` 可执行文件(对应源码中的 `main_surfaceflinger.cpp`)。入口函数是 `main()`,它负责初始化 SurfaceFlinger 实例。核心代码如下: ```cpp int main(int, char**) { // 初始化硬件抽象层 (HAL) 和日志 hardware::configureRpcThreadpool(1, false); sp<ProcessState> ps(ProcessState::self()); ps->startThreadPool(); // 创建 SurfaceFlinger 实例 sp<SurfaceFlinger> flinger = createSurfaceFlinger(); flinger->init(); // 执行初始化 // ... 注册服务并进入主循环 } ``` 此阶段涉及硬件初始化和线程池设置,确保 SurfaceFlinger 能访问显示驱动[^3]。 #### 3. **创建 SurfaceFlinger 实例** - `createSurfaceFlinger()` 函数(定义在 `SurfaceFlingerFactory.cpp` 中)负责实例化 SurfaceFlinger。它使用工厂模式创建对象: ```cpp sp<SurfaceFlinger> createSurfaceFlinger() { static DefaultFactory factory; return sp<SurfaceFlinger>::make(factory); } ``` 此函数调用 `sp<SurfaceFlinger>::make()` 分配内存并构造 SurfaceFlinger 对象。工厂类处理依赖注入,便于测试和扩展[^3]。 #### 4. **初始化 SurfaceFlinger** - 实例创建后,调用 `flinger->init()` 进行初始化: - **硬件层初始化**:加载显示设备(如 LCD 或 OLED),通过 HAL 接口(如 HWC,Hardware Composer)检测屏幕参数(分辨率、刷新率)。 - **服务注册**:将 SurfaceFlinger 注册为系统服务(通过 Binder IPC),使应用进程(如 SystemUI 或 App)能通过 WindowManagerService 请求 Surface。 - **图层管理设置**:初始化图层合成引擎,包括缓冲区队列(BufferQueue)和帧调度器。这一步确保 SurfaceFlinger 准备好接收来自客户端的图层数据[^1][^5]。 #### 5. **进入主循环和处理合成** - 初始化完成后,SurfaceFlinger 进入主事件循环: - 监听来自 WindowManagerService 的合成请求。 - 在 VSync(垂直同步)信号触发时,收集所有图层(如应用窗口、状态栏),执行合成计算。 - 将合成后的帧通过 HWC 或 GPU 渲染到帧缓冲区(framebuffer),最终输出到显示设备。 整个流程设计为高效低功耗,优先使用硬件加速合成[^2][^5]。 #### 总结 SurfaceFlinger启动流程是 Android 显示系统的基础:从 init 进程加载配置,到创建实例、初始化硬件,再到进入合成循环。它在系统启动早期启动(在 Zygote 之前),确保显示服务可用。优化后的启动时间通常在毫秒级,但对系统稳定性至关重要。如果启动失败,会导致黑屏或系统崩溃[^1][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruk_spp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值