图像显示框架五——SurfaceFlinger的启动流程(基于Android 15源码分析)
1.前言
前面介绍了Native应用层如何与SurfaceFlinger进行通信的,但是我们还要了解SurfaceFlinger如何启动起来的,以及一些初始化处理,本文是基于Android 15源码以及Android 15设备进行分析的
本篇涉及的代码位置: /frameworks/native/services/surfaceflinger/
2.SurfaceFlinger的启动与初始化
SurfaceFlinger是一个Binder系统服务,Android设备开机系统启动的时候就会带起SurfaceFlinger服务进程并完成一系列初始化操作
SurfaceFlinger是被编译成一个可执行的二进制档案:surfaceflinger,放在system/bin下面,可以在设备中查询到,如下:

SurfaceFlinger的编译文件Android.bp,如下:
cc_binary {name: "surfaceflinger",defaults: ["libsurfaceflinger_binary","libqtisurfaceflingerextension_defaults",],init_rc: ["surfaceflinger.rc"],srcs: [":surfaceflinger_binary_sources",// Note: SurfaceFlingerFactory is not in the filegroup so that it// can be easily replaced."SurfaceFlingerFactory.cpp",],shared_libs: ["libSurfaceFlingerProp",],static_libs: ["libqticompositionengineextension","libqtisurfaceflingerextension",],logtags: ["EventLog/EventLogTags.logtags"],
}上述可以看出来SurfaceFlinger服务启动过程是有init解析rc文件开始的,然后我们看一下surfaceflinger.rc文件的内容,如下是添加注解过后的内容
# SurfaceFlinger 的 init 服务配置文件
# 位置:通常位于 /system/etc/init/surfaceflinger.rc 或 /vendor/etc/init/surfaceflinger.rc# 定义了一个名为 "surfaceflinger" 的系统服务
service surfaceflinger /system/bin/surfaceflinger# 指定服务类别:属于 "core" 和 "animation" 类# - "core" 类:在启动早期启动的基本系统服务# - "animation" 类:与图形动画相关的服务class core animation# 指定运行身份:以 "system" 用户身份运行# 这是 Android 系统中权限较高的系统用户user system# 指定附加用户组:授予服务额外的权限# - graphics: 图形系统操作权限# - drmrpc: Direct Rendering Manager 远程过程调用权限# - readproc: 读取系统进程信息权限group graphics drmrpc readproc# 授予 Linux 能力:SYS_NICE 能力允许调整进程调度优先级# 这对于实时图形渲染至关重要,可以优先获得 CPU 时间片capabilities SYS_NICE# 重启行为:当 surfaceflinger 重启时,仅在其正在运行时才重启 zygote# 这是关键的安全措施,防止 zygote 被意外重启# zygote 是 Android 应用进程的孵化器,其稳定性至关重要onrestart restart --only-if-running zygote# 任务性能配置:设置为高性能配置文件# 这将调整 CPU 调度器、电源管理等参数,确保图形性能task_profiles HighPerformance# 创建 Unix 域套接字:用于 PDX (Google 的 VR/AR 平台) 显示客户端通信# 权限:0666,用户:system,组:graphics,SELinux 上下文:pdx_display_client_endpoint_socketsocket pdx/system/vr/display/client stream 0666 system graphics u:object_r:pdx_display_client_endpoint_socket:s0# 创建 Unix 域套接字:用于 PDX 显示管理通信socket pdx/system/vr/display/manager stream 0666 system graphics u:object_r:pdx_display_manager_endpoint_socket:s0# 创建 Unix 域套接字:用于 PDX 垂直同步事件通信socket pdx/system/vr/display/vsync stream 0666 system graphics u:object_r:pdx_display_vsync_endpoint_socket:s0如上可以看出来设备在开机启动时,init进程解析surfaceflinger.rc,然后注册surfaceflinger服务,执行system/bin/surfaceflinger,从而启动了SurfaceFlinger服务进程
如下指令可以看到SurfaceFlinger服务是在运行中
ps -A | grep surfaceflinger
system 481 1 80864 13700 0 0 S surfaceflinger然后来看SurfaceFlinger的函数入口,在main_surfaceflinger.cpp的main方法中,如下是精简版
int main(int, char**) {signal(SIGPIPE, SIG_IGN);// 基础服务启动startGraphicsAllocatorService();ProcessState::self()->setThreadPoolMaxThreadCount(4);// 核心实例创建和初始化sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);flinger->init();// 服务注册sp<IServiceManager> sm(defaultServiceManager());sm->addService(String16(SurfaceFlinger::getServiceName()), flinger);sm->addService(String16("SurfaceFlingerAIDL"), sp<SurfaceComposerAIDL>::make(flinger));// 进入主循环flinger->run();return 0;
}如上进行总结:
1. 创建SurfaceFlinger对象,触发执行 SurfaceFlinger::onFirstRef()
2. 调用SurfaceFlinger::init()进行初始化
3. 注册服务到ServiceManager(名字是"SurfaceFlingerAIDL")
ps: SurfaceFlinger 注册的两个不同的 Binder 服务接口
4. 调用SurfaceFlinger::run()
在设备上执行service list命令就可以看到注册的服务, SurfaceFlinger 注册的两个不同的 Binder 服务接口,这体现了 Android 图形系统的架构演进和向后兼容设计。
service list | grep Surface
1 SurfaceFlinger: [android.ui.ISurfaceComposer]
2 SurfaceFlingerAIDL: [android.gui.ISurfaceComposer]
SurfaceFlinger类的头文件,如下是添加注释后的内容
/frameworks/native/services/surfaceflinger/SurfaceFlinger.h
class SurfaceFlinger : public BnSurfaceComposer, // ① Binder服务端桩public PriorityDumper, // ② 优先级调试工具private IBinder::DeathRecipient, // ③ 死亡监听器private HWC2::ComposerCallback, // ④ 硬件合成器回调private ICompositor, // ⑤ 合成器接口 (内部)private scheduler::ISchedulerCallback, // ⑥ 调度器回调private compositionengine::ICEPowerCallback { // ⑦ 合成引擎功耗回调总结如上内容:
继承的类/接口 | 角色 | 主要交互对象 | 关键职责 |
|---|---|---|---|
| Binder 服务桩 | 应用、SystemServer | 处理 IPC 请求,提供图形服务 |
| 调试接口 |
| 输出系统状态和调试信息 |
| 死亡监听器 | 客户端进程 | 清理已终止进程的资源 |
| HWC 回调 | 硬件合成器 (HAL) | 处理热插拔、VSync 事件 |
| 内部合成接口 | 内部合成模块 | 执行合成操作 |
| 调度回调 | VSync 调度器 | 协调帧渲染节奏和策略 |
| 功耗回调 | 合成引擎 | 参与功耗管理策略 |
这行头文件定义完美概括了 SurfaceFlinger的核心使命:它是一个多面手,是 Android 图形栈的中央协调器。
它作为 Binder 服务 接收来自系统各处的请求。
它通过 HWC 回调 与底层硬件紧密对话,响应显示事件。
它通过 调度器回调 协调全局的渲染节奏。
它通过 功耗回调 参与系统的省电策略。
它通过 死亡监听 确保系统的健壮性。
它通过 调试接口 提供可见性,方便问题排查。
这种设计使得 SurfaceFlinger 能够高效地管理所有图形层的生命周期、协调与硬件的交互、调度帧的合成与显示,并最终将像素推送到屏幕上。
创建SurfaceFlinger实例对象
调用surfaceflinger::createSurfaceFlinger()来创建SurfaceFlinger实例,如下是SurfaceFlingerFactory.h文件
/** Copyright 2018 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#pragma once // 防止头文件被多次包含#include <cinttypes> // 提供整数类型定义
#include <functional> // 提供函数对象支持
#include <memory> // 提供智能指针支持
#include <string> // 提供字符串操作支持#include <cutils/compiler.h> // Android编译器特性支持
#include <utils/StrongPointer.h> // Android强指针支持#include <scheduler/Fps.h> // 帧率相关定义namespace android {// 前向声明,减少头文件依赖,提高编译效率
typedef int32_t PixelFormat; // 像素格式类型定义class BufferLayerConsumer; // 缓冲区图层消费者
class DisplayDevice; // 显示设备
class FrameTracer; // 帧追踪器
class GraphicBuffer; // 图形缓冲区
class HWComposer; // 硬件合成器
class IGraphicBufferConsumer; // 图形缓冲区消费者接口
class IGraphicBufferProducer; // 图形缓冲区生产者接口
class Layer; // 图层基类
class LayerFE; // 图层前端(Front End)
class SurfaceFlinger; // SurfaceFlinger主类
class TimeStats; // 时间统计struct DisplayDeviceCreationArgs; // 显示设备创建参数namespace compositionengine {
class CompositionEngine; // 合成引擎
} // namespace compositionenginenamespace scheduler {
class VsyncConfiguration; // VSync配置
class VsyncController; // VSync控制器
} // namespace schedulernamespace frametimeline {
class FrameTimeline; // 帧时间线
} // namespace frametimelinenamespace surfaceflinger {struct LayerCreationArgs; // 图层创建参数
class NativeWindowSurface; // 本地窗口表面/*** @brief SurfaceFlinger 组件工厂接口* * 这是一个抽象工厂模式实现,定义了创建SurfaceFlinger所有核心组件的接口。* 主要目的:* 1. 解耦组件创建和使用* 2. 允许OEM厂商定制特定组件实现* 3. 提供单元测试的mock支持* 4. 简化依赖注入* * 在Android启动过程中,SurfaceFlinger会使用这个工厂创建所有需要的组件。* OEM厂商可以通过实现这个接口来提供硬件特定的优化实现。*/
class Factory {
public:/*** @brief 创建硬件合成器(HWC)实例* @param serviceName HWC服务名称(如"default"或厂商特定名称)* @return 唯一指针指向HWComposer实例* * HWComposer负责与硬件合成器HAL层交互,管理显示硬件资源。* 不同的硬件平台可能有不同的HWC实现。*/virtual std::unique_ptr<HWComposer> createHWComposer(const std::string& serviceName) = 0;/*** @brief 创建VSync配置实例* @param currentRefreshRate 当前刷新率,用于计算VSync相关参数* @return 唯一指针指向VsyncConfiguration实例* * Vsync配置管理VSync事件的偏移、周期和相位等参数,* 用于优化显示流水线和减少延迟。*/virtual std::unique_ptr<scheduler::VsyncConfiguration> createVsyncConfiguration(Fps currentRefreshRate) = 0;/*** @brief 创建显示设备实例* @param args 显示设备创建参数(类型、尺寸、连接状态等)* @return 强指针指向DisplayDevice实例* * DisplayDevice代表一个物理或虚拟显示设备(如内置屏幕、HDMI、WiFi显示等),* 管理显示的属性和状态。*/virtual sp<DisplayDevice> createDisplayDevice(DisplayDeviceCreationArgs& args) = 0;/*** @brief 创建图形缓冲区* @param width 缓冲区宽度(像素)* @param height 缓冲区高度(像素)* @param format 像素格式(如RGBA_8888)* @param layerCount 图层数量(用于层级缓冲区)* @param usage 使用标志位(CPU读/写、GPU读/写等)* @param requestorName 请求者名称(用于调试和内存跟踪)* @return 强指针指向GraphicBuffer实例* * GraphicBuffer是图形内存的核心抽象,封装了gralloc内存分配。* 用于存储图层内容和渲染输出。*/virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t width, uint32_t height,PixelFormat format, uint32_t layerCount,uint64_t usage, std::string requestorName) = 0;/*** @brief 创建缓冲区队列(生产者-消费者对)* @param outProducer 输出参数:图形缓冲区生产者* @param outConsumer 输出参数:图形缓冲区消费者* @param consumerIsSurfaceFlinger 标识消费者是否是SurfaceFlinger本身* * 缓冲区队列是Android图形系统的核心IPC机制,实现了生产者-消费者模式。* 应用作为生产者填充缓冲区,SurfaceFlinger作为消费者合成缓冲区。*/virtual void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,sp<IGraphicBufferConsumer>* outConsumer,bool consumerIsSurfaceFlinger) = 0;/*** @brief 创建本地窗口表面* @param producer 图形缓冲区生产者接口* @return 唯一指针指向NativeWindowSurface实例* * NativeWindowSurface是SurfaceFlinger与本地窗口系统之间的桥梁,* 负责管理渲染表面和缓冲区交换。*/virtual std::unique_ptr<surfaceflinger::NativeWindowSurface> createNativeWindowSurface(const sp<IGraphicBufferProducer>& producer) = 0;/*** @brief 创建合成引擎* @return 唯一指针指向CompositionEngine实例* * CompositionEngine负责实际的图层合成操作,支持多种合成策略:* 1. 硬件合成(通过HWC)* 2. GPU合成(通过OpenGL ES)* 3. 混合合成(部分图层硬件合成,部分GPU合成)*/virtual std::unique_ptr<compositionengine::CompositionEngine> createCompositionEngine() = 0;/*** @brief 创建缓冲区状态图层* @param args 图层创建参数(名称、父图层、标志位等)* @return 强指针指向Layer实例* * BufferStateLayer用于管理具有复杂状态(如变换、透明度、动画)的图层,* 是现代Android图形系统的主要图层类型。*/virtual sp<Layer> createBufferStateLayer(const LayerCreationArgs& args) = 0;/*** @brief 创建特效图层* @param args 图层创建参数* @return 强指针指向Layer实例* * EffectLayer用于实现视觉特效,如模糊、颜色调整、遮罩等。* 通常由SurfaceFlinger内部使用,而不是由应用直接创建。*/virtual sp<Layer> createEffectLayer(const LayerCreationArgs& args) = 0;/*** @brief 创建图层前端(Front End)* @param layerName 图层名称(用于调试和标识)* @param owner 拥有此LayerFE的Layer实例* @return 强指针指向LayerFE实例* * LayerFE(Layer Front End)是图层在合成前端的表示,* 负责维护图层的视觉状态和合成属性,与Layer后端协同工作。*/virtual sp<LayerFE> createLayerFE(const std::string& layerName, const Layer* owner) = 0;/*** @brief 创建帧追踪器* @return 唯一指针指向FrameTracer实例* * FrameTracer用于跟踪和记录帧的生命周期事件(开始、结束、延迟等),* 提供性能分析和调试能力。*/virtual std::unique_ptr<FrameTracer> createFrameTracer() = 0;/*** @brief 创建帧时间线* @param timeStats 时间统计实例,用于记录性能数据* @param surfaceFlingerPid SurfaceFlinger进程ID* @return 唯一指针指向FrameTimeline实例* * FrameTimeline提供精确的帧时间信息,用于:* 1. 帧率控制和稳定性优化* 2. 掉帧检测和分析* 3. 性能指标收集和报告*/virtual std::unique_ptr<frametimeline::FrameTimeline> createFrameTimeline(std::shared_ptr<TimeStats> timeStats, pid_t surfaceFlingerPid) = 0;protected:/*** @brief 保护析构函数,确保只能通过指针正确销毁* * 工厂类通常通过基类指针被引用,需要虚析构函数确保正确清理资源。* 保护访问权限防止直接实例化,鼓励通过智能指针管理。*/~Factory() = default;
};/*** @brief 创建SurfaceFlinger实例的全局工厂函数* @return 强指针指向SurfaceFlinger实例* * 这是SurfaceFlinger主实例的入口点,执行以下操作:* 1. 创建默认或自定义的Factory实现* 2. 使用工厂创建SurfaceFlinger实例* 3. 初始化所有必要的组件* * ANDROID_API宏确保符号在Android SDK中正确导出。*/
ANDROID_API sp<SurfaceFlinger> createSurfaceFlinger();} // namespace surfaceflinger
} // namespace android可以看出来Factory中有很多create方法,再看下创建SurfaceFlinger的具体实现,在SurfaceFlingerFactory.cpp中
sp<SurfaceFlinger> createSurfaceFlinger() {static DefaultFactory factory;return sp<SurfaceFlinger>::make(factory);
}上述内容可以看出来在构建SurfaceFlinger过程中传递了一个factory,这个factory里面实现了其他的create方法,在SurfaceFlingerDefaultFactory.cpp中,这里就不具体解析了
如下是关系图
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────────┐
│ Factory │ │ DefaultFactory │ │ SurfaceFlinger │
│ (抽象基类) │◄───────│ (具体实现类) │ │ (客户端类) │
│ │ 继承 │ │ │ - mFactory: Factory&│
│ │ │ │ │ + getFactory(): Factory&│
└─────────────────┘ └──────────────────┘ └─────────────────────┘
▲ │
│ │ 包含引用
└────────────────────────────────────────────────────┘
mFactory (实际指向 DefaultFactory)
SurfaceFlinger构造函数,内容很多,截取一部分
SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag): mFactory(factory),mPid(getpid()),mTimeStats(std::make_shared<impl::TimeStats>()),mFrameTracer(mFactory.createFrameTracer()),mFrameTimeline(mFactory.createFrameTimeline(mTimeStats, mPid)),mCompositionEngine(mFactory.createCompositionEngine()),mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),mTunnelModeEnabledReporter(sp<TunnelModeEnabledReporter>::make()),mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)),mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", !mEmulatedDisplayDensity)),mPowerAdvisor(std::make_unique<Hwc2::impl::PowerAdvisor>(*this)),mWindowInfosListenerInvoker(sp<WindowInfosListenerInvoker>::make()),mSkipPowerOnForQuiescent(base::GetBoolProperty("ro.boot.quiescent"s, false)) {ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());
}SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization) {ATRACE_CALL();ALOGI("SurfaceFlinger is starting");hasSyncFramework = running_without_sync_framework(true);dispSyncPresentTimeOffset = present_time_offset_from_vsync_ns(0);useHwcForRgbToYuv = force_hwc_copy_for_virtual_displays(false);maxFrameBufferAcquiredBuffers = max_frame_buffer_acquired_buffers(2);minAcquiredBuffers =SurfaceFlingerProperties::min_acquired_buffers().value_or(minAcquiredBuffers);maxGraphicsWidth = std::max(max_graphics_width(0), 0);maxGraphicsHeight = std::max(max_graphics_height(0), 0);mSupportsWideColor = has_wide_color_display(false);mDefaultCompositionDataspace =static_cast<ui::Dataspace>(default_composition_dataspace(Dataspace::V0_SRGB));mWideColorGamutCompositionDataspace = static_cast<ui::Dataspace>(wcg_composition_dataspace(mSupportsWideColor ? Dataspace::DISPLAY_P3 : Dataspace::V0_SRGB));
SurfaceFlinger 构造函数分为两个部分:
委托构造函数 (
SurfaceFlinger(Factory& factory, SkipInitializationTag)):进行核心成员变量的初始化主构造函数 (
SurfaceFlinger(Factory& factory)):进行系统配置、属性读取和功能开关设置
上述简要总结:
第一阶段:核心组件构建
工厂模式注入:通过Factory创建可插拔的组件实例
监控组件初始化:时间统计、帧追踪、帧时间线
合成引擎创建:CompositionEngine负责实际合成工作
服务配置:HWC服务名称、显示密度等基础配置
第二阶段:系统配置读取
硬件能力检测:广色域、模糊效果等硬件特性
性能参数设置:缓冲区数量、图形尺寸限制等
调试功能配置:通过各种debug属性控制调试行为
平台扩展加载:QTI等平台特定功能扩展
第三阶段:功能开关确定
基于系统属性:读取ro.、debug.、persist.等属性
基于硬件能力:检测实际硬件支持的功能
基于构建类型:区分user/debug版本的不同行为
