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() 是初始化的核心,其内部分为多个关键子步骤:
-
基础设置 :初始化
CompositionEngine(合成引擎)等组件。 -
创建
RenderEngine:负责 2D/3D 图形渲染,当硬件无法合成时作为备选(Client 合成模式)。 -
初始化
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的构造函数会加载HWCHAL 模块,打开硬件设备,并注册回调。这些回调是SurfaceFlinger接收底层显示事件(如 VSync)的唯一通道。 -
configureLocked()初始显示配置:检测启动时已连接的显示器。 -
初始化调度系统 (
Scheduler) :负责管理合成任务的调度和 VSync 信号的监听。 -
启动
StartPropertySetThread线程 :设置系统属性,通知其它进程SurfaceFlinger已准备就绪。
flinger->init() 完成后,main() 函数会通过 ServiceManager 将 SurfaceFlinger 的 Binder 服务注册到系统中,服务名为 "SurfaceFlingerAIDL"。此后,其他系统服务和应用程序就能通过 Binder 跨进程通信,向 SurfaceFlinger 发送合成、显示等请求。
最后,flinger->run() 使 SurfaceFlinger 进入无限主循环。这个循环负责:
- 等待消息 :等待
mEventQueue中的新消息。 - 处理 VSync:VSync 信号到来时,触发合成操作。
- 执行合成 :调用
handleMessageRefresh()等函数,执行实际的图层合成和送显操作。
至此,SurfaceFlinger 服务完全启动,作为 Android 图形系统的"心脏"开始持续跳动,为整个系统提供稳定、高效的图形合成服务。