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 图形系统的"心脏"开始持续跳动,为整个系统提供稳定、高效的图形合成服务。

相关推荐
YB13756 小时前
jetpack compose 副作用 SideEffect
android·kotlin
CHB8 小时前
uni-app x 蒸汽模式 性能测试基准报告 Benchmark【Android版】
android·ios·uni-app
带娃的IT创业者9 小时前
拆掉那堵墙:LibrePods 如何让 AirPods 在 Android 上重获新生
android·开源项目·airpods·librepods·生态解锁
_阿南_10 小时前
flutter 展示的字体突然奔放了
android·flutter·ios
文人sec13 小时前
MySQL事务与索引做了什么?
android·笔记·mysql
刘洋浪子14 小时前
AndroidStudio保存日志菜单
android
朱涛的自习室14 小时前
从 Prompt 到 Graph:AI 工程的进化史
android·前端·人工智能
2501_9327502615 小时前
Android 中 Serializable 与 Parcelable 的对比与选择
android
FungLeo16 小时前
Flutter 两个反直觉布局坑:ListTile 水波纹 / VerticalDivider 踩坑实录
android·flutter
1570925113416 小时前
ViewBinding与DataBinding区别与选型
android