android 12 SurfaceFlinger开机启动分析

Android 系统中,SurfaceFlinger 是负责图形渲染和显示合成的核心服务。它是一个独立的系统进程,其启动流程从 init 进程解析配置文件开始,最终在 main() 函数中完成对象的创建、初始化和服务注册。

scss 复制代码
// 文件:frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
int main(int, char**) {
    // 1. 忽略SIGPIPE信号,防止在Socket通信断开时进程崩溃
    signal(SIGPIPE, SIG_IGN);

    // 2. 配置Binder通信环境
    // 限制Binder线程池最大线程数为4
    ProcessState::self()->setThreadPoolMaxThreadCount(4);
    // 启动Binder线程池
    sp<ProcessState> ps(ProcessState::self());
    ps->startThreadPool();

    // 3. 创建核心SurfaceFlinger对象(智能指针)
    sp<SurfaceFlinger> flinger = new SurfaceFlinger();

    // 4. 提升进程优先级,确保图形渲染的实时性
    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
    set_sched_policy(0, SP_FOREGROUND);
    // 将线程放入 system-background cpuset,避免占用大核
    set_cpuset_policy(0, SP_SYSTEM);

    // 5. 执行SurfaceFlinger的核心初始化
    flinger->init();

    // 6. 向ServiceManager注册Binder服务
    sp<IServiceManager> sm(defaultServiceManager());
    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);

    // 7. 启动SurfaceFlinger的主循环
    flinger->run();

    return 0;
}

main() 函数中,new SurfaceFlinger() 创建了一个 SurfaceFlinger 对象,并由智能指针 sp<SurfaceFlinger> 管理。智能指针在第一次被引用 时,会触发 onFirstRef() 回调。

javascript 复制代码
// 文件:frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::onFirstRef() {
    // 初始化事件队列,这是SF消息循环的基础
    mEventQueue.init(this);
    
}

mEventQueue.init(this) 初始化了事件队列,后续所有 VSync 信号、屏幕刷新请求等都会以消息的形式放入此队列。run() 则启动了一个独立的线程,SurfaceFlinger 的主循环实际上是在这个新线程中执行的,而非 main() 函数所在的线程。

flinger->init() 是初始化的核心,其内部分为多个关键子步骤:

  1. 基础设置 :初始化 CompositionEngine(合成引擎)等组件。

  2. 创建 RenderEngine:负责 2D/3D 图形渲染,当硬件无法合成时作为备选(Client 合成模式)。

  3. 初始化 HWComposer:与硬件合成器 HAL 层通信的关键对象。

    ini 复制代码
    // 文件:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp
    HWComposer::HWComposer(const sp<SurfaceFlinger>& flinger)
        : mFlinger(flinger), ... {
        // 1. 加载 HWC HAL 模块
        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
        // 2. 打开 HWC 设备
        err = hwc_open(mModule, &mHwc);
        // 3. 注册回调函数,以便接收来自HAL层的事件(如VSync)
        if (mHwc->registerProcs) {
            mCBContext.hwc = this;
            mCBContext.procs.invalidate = &hook_invalidate;
            mHwc->registerProcs(mHwc, &mCBContext.procs);
        }
    }

    HWComposer 的构造函数会加载 HWC HAL 模块,打开硬件设备,并注册回调。这些回调是 SurfaceFlinger 接收底层显示事件(如 VSync)的唯一通道。

  4. configureLocked() 初始显示配置:检测启动时已连接的显示器。

  5. 初始化调度系统 (Scheduler) :负责管理合成任务的调度和 VSync 信号的监听。

  6. 启动 StartPropertySetThread 线程 :设置系统属性,通知其它进程 SurfaceFlinger 已准备就绪。

flinger->init() 完成后,main() 函数会通过 ServiceManagerSurfaceFlinger 的 Binder 服务注册到系统中,服务名为 "SurfaceFlingerAIDL"。此后,其他系统服务和应用程序就能通过 Binder 跨进程通信,向 SurfaceFlinger 发送合成、显示等请求。

最后,flinger->run() 使 SurfaceFlinger 进入无限主循环。这个循环负责:

  • 等待消息 :等待 mEventQueue 中的新消息。
  • 处理 VSync:VSync 信号到来时,触发合成操作。
  • 执行合成 :调用 handleMessageRefresh() 等函数,执行实际的图层合成和送显操作。

至此,SurfaceFlinger 服务完全启动,作为 Android 图形系统的"心脏"开始持续跳动,为整个系统提供稳定、高效的图形合成服务。

相关推荐
hunterandroid7 小时前
Paging 3 RemoteMediator 实战:构建离线优先的分页列表
android·前端
码农coding7 小时前
android12 开机启动PMS
android
Days20507 小时前
GPT-Image-2 国风美学人设生成提示词分享
android·gpt
浮江雾7 小时前
Flutter第十节-----Flutter布局与组件全解析
android·开发语言·前端·学习·flutter·入门
Jomurphys8 小时前
Compose 适配 - 自适应布局(窗口大小类 WindowSizeClasses、列表详情、辅助窗格)
android·compose
plainGeekDev9 小时前
synchronized → Coroutines
android·java·kotlin
sun0077009 小时前
gtest 行覆盖率、函数覆盖率、分支覆盖率 . 一般这3个要达到多少?算达标
android
施棠海9 小时前
设计稿一键变成可运行的Android页面:Pixel2XML全流程UI开发框架实战(附完整源码)
android·ui·架构
Jomurphys10 小时前
Compose 适配 - 分辨率(密度)
android·compose