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

相关推荐
BoomHe1 小时前
Android Framework 文件应用移植到 AndroidStudio
android
传奇开心果编程3 小时前
【Jetpack Compose基础语法学与练】第8课 rememberSaveable,页面旋转/系统重建保留状态
android·学习·ui·kotlin·android jetpack
>Andre<3 小时前
UFS5.0标准中文全译·卷一:范围、术语与架构
android·linux·嵌入式硬件
事圆则缓4 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
mmsx4 小时前
Android 地图十万要素不卡顿:空间网格 + 渐进式加载的移动端实践
android·大数据·opengl
Godikov6 小时前
Android 工业终端保活实战:前台服务 + 开机自启 + 更新自启的三重保障
android
字节暗面6 小时前
SO加固强度怎么量化?腾讯ACE与FairGuard静态分析实测
android·逆向
终端安全笔记7 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
字节暗面8 小时前
一次游戏安全SO静态分析记录:腾讯ACE与FairGuard加固强度对比
android·逆向工程·游戏加固
传奇开心果编程8 小时前
【Jetpack Compose基础语法学与练】第9课 SideEffect副作用 + LaunchedEffect,处理异步任务和生命周期
android·学习·ui·kotlin·android jetpack