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() 函数会通过 ServiceManager 将 SurfaceFlinger 的 Binder 服务注册到系统中,服务名为 "SurfaceFlingerAIDL"。此后,其他系统服务和应用程序就能通过 Binder 跨进程通信,向 SurfaceFlinger 发送合成、显示等请求。

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

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

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

相关推荐
驰骋工作流15 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程16 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽20 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_5633714720 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
AIsoft_86891 天前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频
booboosui1 天前
第一批个人 Agent 用户正在卸载,问题不在模型,在它住在哪儿
android
洞见前行1 天前
点击图标到内容出现,你的 App 在这几秒里做了什么:Android 冷启动全链路优化实战
android·性能优化·android studio
凯基迪科技1 天前
芯片UID绑定修改 加密与逆向修改思路分析
android
Liben1 天前
Weex开发踩坑记录
android·前端·ios
救救孩子把1 天前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务