当前位置: 首页 > news >正文

图像显示框架五——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 { // ⑦ 合成引擎功耗回调

总结如上内容:

继承的类/接口

角色

主要交互对象

关键职责

BnSurfaceComposer

Binder 服务桩

应用、SystemServer

处理 IPC 请求,提供图形服务

PriorityDumper

调试接口

dumpsys工具

输出系统状态和调试信息

IBinder::DeathRecipient

死亡监听器

客户端进程

清理已终止进程的资源

HWC2::ComposerCallback

HWC 回调

硬件合成器 (HAL)

处理热插拔、VSync 事件

ICompositor

内部合成接口

内部合成模块

执行合成操作

ISchedulerCallback

调度回调

VSync 调度器

协调帧渲染节奏和策略

ICEPowerCallback

功耗回调

合成引擎

参与功耗管理策略

这行头文件定义完美概括了 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 构造函数分为两个部分:

  1. ​委托构造函数​​ (SurfaceFlinger(Factory& factory, SkipInitializationTag)):进行核心成员变量的初始化

  2. ​主构造函数​​ (SurfaceFlinger(Factory& factory)):进行系统配置、属性读取和功能开关设置

上述简要总结:

第一阶段:核心组件构建

  1. ​工厂模式注入​​:通过Factory创建可插拔的组件实例

  2. ​监控组件初始化​​:时间统计、帧追踪、帧时间线

  3. ​合成引擎创建​​:CompositionEngine负责实际合成工作

  4. ​服务配置​​:HWC服务名称、显示密度等基础配置

第二阶段:系统配置读取

  1. ​硬件能力检测​​:广色域、模糊效果等硬件特性

  2. ​性能参数设置​​:缓冲区数量、图形尺寸限制等

  3. ​调试功能配置​​:通过各种debug属性控制调试行为

  4. ​平台扩展加载​​:QTI等平台特定功能扩展

第三阶段:功能开关确定

  1. ​基于系统属性​​:读取ro.、debug.、persist.等属性

  2. ​基于硬件能力​​:检测实际硬件支持的功能

  3. ​基于构建类型​​:区分user/debug版本的不同行为

http://www.dtcms.com/a/574731.html

相关文章:

  • 多线程之线程本地存储(Thread-Local Storage)
  • 基础数据结构之哈希表:两数之和(LeetCode 1 简单题)
  • 大公司网站建设建网站网站关键词书写步骤
  • 临沂网站建设优化网站开发业务规划
  • “移动政务”业务门户安全解决方案
  • 视频号网页版怎么发布视频优化网络的软件
  • 网站建设销售技巧和话术百度号码认证
  • 用什么软件快速做网站wordpress文章链接插件
  • 游戏网站建设杭州网站开发运营成本
  • 数字沙盘鹰眼导航电子沙盘:主副地图实时协同交互
  • 操作系统原理--进程线程
  • AI 空间细胞表型分析赋能肺癌诊疗:从 “看大小” 到 “看邻里”,精准分层风险
  • 个人网站开发的现状高德能看国外地图吗
  • 【StringJoiner 、StringBuilder、StringBuffer 功能解读】
  • 中国建设网站简州新城土地整改项目网站内容发布平台源码
  • 天津网站推广外包快看点自媒体平台注册入口和下载
  • 厦门专业做网站的wordpress插件国际化
  • 【pycharm 创建一个线程,在线程函数中增加的日志打印,日志打印了,但是打断点进不去】
  • Rust 练习册 5:Fn、FnMut 和 FnOnce trait
  • 哈尔滨cms模板建站wordpress 支持小工具
  • 上海公司查询网站网站改版 新闻
  • 电阻发热的底层逻辑
  • 虚拟机原理
  • 2003访问网站提示输入用户名密码wordpress右键插件
  • 营销网站建设的目的推广你公司网站
  • 如何建设音乐网站如何注册一个平台
  • 网址导航浏览器下载苏州seo优化外包公司
  • DVL多普勒速度计原理与嵌入式实现
  • vs怎么建手机网站网站开发开题报告范文2019
  • 迅为RK3576开发板编译环境Ubuntu20.04编译配置-修改物理内存