首页 > 编程语言 >Android T(13) 源码分析 — 原生层 Surface 的创建

Android T(13) 源码分析 — 原生层 Surface 的创建

时间:2025-01-15 16:29:55浏览次数:3  
标签:13 const sp Surface SurfaceComposerClient 源码 uint32 ISurfaceComposerClient

Android T(13) 源码分析 — 原生层 Surface 的创建


文章目录


前言

该系列文章基于 Android T(13) 的源码进行分析,内容会逐渐丰富,欢迎大家点赞关注。


摘要

在 Android 系统中,Surface 是用于图形渲染的一个重要组件,它提供了一个可以绘制图形的缓冲区。Surface 的创建和管理涉及到多个层次的代码,包括 Java 层、JNI 层和原生层。本篇文章基于Android T(13)的源码,分析原生层的 Surface 创建过程。时序图如下:
在这里插入图片描述


一、SurfaceComposerClient 的 createSurfaceChecked 分析

JNI 层通过 nativeCreate 调用到原生层 SurfaceComposerClient 里面的 createSurfaceChecked 创建 Surface。这里需要留意一下,createSurfaceChecked 创建了一个 IGraphicBufferProducer,IGraphicBufferProducer 可以实现 Buffer 的申请,来存储绘制的信息。这里不做过多介绍,后面会单独另外介绍 Buffer Queue 相关内容。

//frameworks/native/libs/gui/SurfaceComposerClient.cpp
status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
                                                     PixelFormat format,
                                                     sp<SurfaceControl>* outSurface, uint32_t flags,
                                                     const sp<IBinder>& parentHandle,
                                                     LayerMetadata metadata,
                                                     uint32_t* outTransformHint) {
    sp<SurfaceControl> sur;
//...
        sp<IGraphicBufferProducer> gbp;
//...
        err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
                                     &handle, &gbp, &id, &transformHint);

//...
            *outSurface =
                    new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
//...
}

我们看一下 mClient 的定义:

//frameworks/native/libs/gui/SurfaceComposerClient.cpp
SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
      : mStatus(NO_ERROR), mClient(client) {}

二、ISurfaceComposerClient 的 createSurface分析

这里我们看一下 ISurfaceComposerClient 的定义:

//frameworks/native/libs/gui/include/gui/ISurfaceComposerClient.h
class ISurfaceComposerClient : public IInterface {
public:
//...
    virtual status_t createSurface(const String8& name, uint32_t w, uint32_t h, PixelFormat format,
                                   uint32_t flags, const sp<IBinder>& parent,
                                   LayerMetadata metadata, sp<IBinder>* handle,
                                   sp<IGraphicBufferProducer>* gbp, int32_t* outLayerId,
                                   uint32_t* outTransformHint) = 0;
//...

在 ISurfaceComposerClient 中,createSurface 是一个虚函数,具体的实现在 BpSurfaceComposerClient,BpSurfaceComposerClient 是 SurfaceComposerClient 的客户端实现:

//frameworks/native/libs/gui/ISurfaceComposerClient.cpp
class BpSurfaceComposerClient : public SafeBpInterface<ISurfaceComposerClient> {
public:
    explicit BpSurfaceComposerClient(const sp<IBinder>& impl)
          : SafeBpInterface<ISurfaceComposerClient>(impl, "BpSurfaceComposerClient") {}
//...

BpSurfaceComposerClient 中 createSurface 直接转到了服务端:

//frameworks/native/libs/gui/ISurfaceComposerClient.cpp
    status_t createSurface(const String8& name, uint32_t width, uint32_t height, PixelFormat format,
                           uint32_t flags, const sp<IBinder>& parent, LayerMetadata metadata,
                           sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp,
                           int32_t* outLayerId, uint32_t* outTransformHint) override {
        return callRemote<decltype(&ISurfaceComposerClient::createSurface)>(Tag::CREATE_SURFACE,
                                                                            name, width, height,
                                                                            format, flags, parent,
                                                                            std::move(metadata),
                                                                            handle, gbp, outLayerId,
                                                                            outTransformHint);
    }

接下来我们再看一下 SurfaceComposerClient 的服务端 BnSurfaceComposerClient

//frameworks/native/libs/gui/include/gui/ISurfaceComposerClient.h
class BnSurfaceComposerClient : public SafeBnInterface<ISurfaceComposerClient> {
public:
    BnSurfaceComposerClient()
          : SafeBnInterface<ISurfaceComposerClient>("BnSurfaceComposerClient") {}

    status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override;
};

服务端的 createSurface 不在 gui 文件夹了,已经转到了 surfaceflinger:

//frameworks/native/services/surfaceflinger/Client.h
class Client : public BnSurfaceComposerClient
{
public:
    explicit Client(const sp<SurfaceFlinger>& flinger);
//...
private:
    // ISurfaceComposerClient interface
    virtual status_t createSurface(const String8& name, uint32_t w, uint32_t h, PixelFormat format,
                                   uint32_t flags, const sp<IBinder>& parent,
                                   LayerMetadata metadata, sp<IBinder>* handle,
                                   sp<IGraphicBufferProducer>* gbp, int32_t* outLayerId,
                                   uint32_t* outTransformHint = nullptr);
//...

这里我们可以看到,Client 继承了 BnSurfaceComposerClient,也就是 SurfaceComposerClient 的服务端,具体的 createSurface 实现:

//frameworks/native/services/surfaceflinger/Client.cpp
status_t Client::createSurface(const String8& name, uint32_t /* w */, uint32_t /* h */,
                               PixelFormat /* format */, uint32_t flags,
                               const sp<IBinder>& parentHandle, LayerMetadata metadata,
                               sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* /* gbp */,
                               int32_t* outLayerId, uint32_t* outTransformHint) {
    // We rely on createLayer to check permissions.
    LayerCreationArgs args(mFlinger.get(), this, name.c_str(), flags, std::move(metadata));
    return mFlinger->createLayer(args, outHandle, parentHandle, outLayerId, nullptr,
                                 outTransformHint);
}

mFlinger 就是 SurfaceFlinger :

//frameworks/native/services/surfaceflinger/Client.cpp
Client::Client(const sp<SurfaceFlinger>& flinger)
    : mFlinger(flinger)
{
}

在 SurfaceFlinger 一侧,Surface 又有另外一个称呼 Layer。所以最终,Surface 是 Java 层提出申请创建,而最终是由 SurfaceFlinger 实现创建。


总结

至此,原生层的 Surface 流转过程已经分析完。简单总结一下,Java 层 relayoutWindow 发起 relyout,通过 JNI 向原生层提出申请创建 Surface,通过 ISurfaceComposerClient 最终通过 SurfaceFlinger 创建 Layer。在这个过程中,返回 Java 层的 Surface 也包含了 IGraphicBufferProducer(由 ISurfaceComposerClient 创建),进而帮助后面进行具体的 Buffer 申请。


标签:13,const,sp,Surface,SurfaceComposerClient,源码,uint32,ISurfaceComposerClient
From: https://blog.csdn.net/qq_39941677/article/details/145154686

相关文章

  • 计算机毕业设计—460164 新能源汽车换电帮管理小程序的设计与实现(源码免费领)
    摘要1绪论1.1课题背景1.2研究现状1.3论文结构与章节安排2 新能源汽车换电帮管理小程序系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3系统用例......
  • 20221320冯泰瑞《密码系统设计》第十二周
    20221320冯泰瑞《密码系统设计》第十二周学习内容HeadFirstC嗨翻C语言第12章课程mindmapAI对学习内容的总结要求让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可以使用微信读书或者云班课电子教材总结《HeadFirstC》第十二章的内容主要介绍了如何在C语言中使......
  • 20221320冯泰瑞—阅读习惯(选做)
    阅读习惯(选做)1.推荐参考批判性思维书单https://weread.qq.com/misc/booklist/3107758_7sb8Fs2Hv,机关公文写作书单https://weread.qq.com/misc/booklist/3107758_7TeJ68iPx,公务员素质书单https://weread.qq.com/misc/booklist/3107758_7usfrsrTZ从中选择阅读,养成阅读习惯2.提......
  • 20221320冯泰瑞《密码系统设计》第十周
    20221320冯泰瑞《密码系统设计》第十周学习内容HeadFirstC嗨翻C语言第10章课程mindmapAI对学习内容的总结要求让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可以使用微信读书或者云班课电子教材总结《HeadFirstC》第十章的内容主题是进程间通信(InterprocessC......
  • 【附源码】JAVA学生考试系统源码+SpringBoot+VUE+前后端分离
    学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:学生考试系统 。本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员!一.系统演示系统测试截图  系统视频演示 https://githubs.xyz/show/338.mp4 二.系统概述 【系统......
  • 20221320冯泰瑞《密码系统设计》第十一周
    20221320冯泰瑞《密码系统设计》第十一周学习内容HeadFirstC嗨翻C语言第11章课程mindmapAI对学习内容的总结要求让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可以使用微信读书或者云班课电子教材总结《HeadFirstC》第十一章的内容主要介绍了C语言中网络编程......
  • 国产化板卡设计原理图:2136-KC705E增强版基于FMC接口的 JFM7K325T PCIeX8 接口卡
    KC705E增强版基于FMC接口的JFM7K325TPCIeX8接口卡    一、板卡概述   本板卡基于FPGAJFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动。    二、功......
  • JSP陇西文旅特色小镇网站q68nq--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着旅游业的快速发展,陇西地区作为具有丰富历史文化和自然景观的区域,亟需一个综合性的文旅特色小镇网站来推广其旅游资源,提升服务质量......
  • JSP流浪动物救助公益管理系统3gj1o程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景城市化进程中,流浪动物问题愈发突出,其生存与健康面临严峻挑战。为提升救助效率,促进流浪动物保护公益事业的健康发展,我们计划开发一个流......
  • JSP零食销售系统9y0w4(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题背景随着信息化时代的到来,零食行业也迎来了快速发展。消费者对于零食的需求日益多样化,零食销售系统在此背景下应运而生。本系统旨在提供一......