没有合适的资源?快使用搜索试试~ 我知道了~
Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
2 下载量 113 浏览量
2021-01-31
04:12:02
上传
评论 1
收藏 747KB PDF 举报
温馨提示
在本文中,我们将详细分析Android应用程序请求SurfaceFlinger服务创建Surface的过程。在讲述Android应用程序请求SurfaceFlinger服务创建Surface之前,我们首先了解一个Surface是由什么组成的。我们可以将Surface理解为一个绘图表面,Android应用程序负责往这个绘图表面填内容,而SurfaceFlinger服务负责将这个绘图表面的内容取出来,并且渲染在显示屏上。在SurfaceFlinger服务这一侧,绘图表面使用Layer类来描述,Layer类的实现如图1所示。图1Layer类的实现Layer类继承了LayerBaseClient类;
资源推荐
资源详情
资源评论
















Android应用程序请求应用程序请求SurfaceFlinger服务创建服务创建Surface的过程的过程
分析分析
在本文中,我们将详细分析Android应用程序请求SurfaceFlinger服务创建Surface的过程。
在讲述Android应用程序请求SurfaceFlinger服务创建Surface之前,我们首先了解一个Surface是由什么组成的。我们可以将
Surface理解为一个绘图表面,Android应用程序负责往这个绘图表面填内容,而SurfaceFlinger服务负责将这个绘图表面的内
容取出来,并且渲染在显示屏上。
在SurfaceFlinger服务这一侧,绘图表面使用Layer类来描述,Layer类的实现如图1所示。
图1 Layer类的实现
Layer类继承了LayerBaseClient类;LayerBaseClient类继承了LayerBase类;LayerBase类继续了RefBase类。从这些继承关
系就可以看出,我们可以通过Android系统的智能指针来引用Layer对象,从而可以自动地维护它们的生命周期。
Layer类内部的成员变量mUserClientRef指向了一个ClientRef对象,这个ClientRef对象内部有一个成员变量mControlBlock,
它指向了一个SharedBufferServer对象。从前面Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)
的创建过程分析一文可以知道,SharedBufferServer类是用来在SurfaceFlinger服务这一侧描述一个UI元数据缓冲区堆栈的,
即在SurfaceFlinger服务中,每一个绘图表面,即一个Layer对象,都关联有一个UI元数据缓冲区堆栈。
LayerBaseClient类内部有一个类型为LayerBaseClient::Surface的弱指针,它引用了一个Layer::SurfaceLayer对象。这个
Layer::SurfaceLayer对象是一个Binder本地对象,它是SurfaceFlinger服务用来与Android应用程序建立通信的,以便可以共同
维护一个绘图表面。
Layer::SurfaceLayer类继承了LayerBaseClient::Surface类,它的实现如图2所示。

图2 SurfaceLayer类的实现
理解这个图需要了解Android系统的Binder进程间通信机制,具体可以参考Android进程间通信(IPC)机制Binder简要介绍和
学习计划一文。从这里就可以看出,Layer::SurfaceLayer类实现了ISurface接口,而Android应用程序就是通过这个接口来和
SurfaceFlinger服务共同维护一个绘图表面的。
Layer::SurfaceLayer类内部有两个成员变量mFlinger和mOwner,前者指向了SurfaceFlinger服务,而后者指向了其宿主Layer
对象。
ISurface接口定义在文件frameworks/base/include/surfaceflinger/ISurface.h中,它有一个重要的成员函数requestBuffer,如下
所示:
class ISurface : public IInterface
{
......
public:
DECLARE_META_INTERFACE(Surface);
/*
* requests a new buffer for the given index. If w, h, or format are
* null the buffer is created with the parameters assigned to the
* surface it is bound to. Otherwise the buffer's parameters are
* set to those specified.
*/
virtual sp<GraphicBuffer> requestBuffer(int bufferIdx,
uint32_t w, uint32_t h, uint32_t format, uint32_t usage) = 0;
......
};
Android应用程序就是通过ISurface接口的成员函数requestBuffer来请求SurfaceFlinger服务为它的一个绘图表面分配一个图形
缓冲区的,这个图形缓冲区使用一个GraphicBuffer对象来描述。
由于Layer::SurfaceLayer是一个Binder本地对象类,因此,就相应地有一个Binder代理对象类,它的名称为BpSurface,它的
实现如图3所示。

图3 BpSurface类的实现
理解这个图同样需要了解Android系统的Binder进程间通信机制,具体可以参考Android进程间通信(IPC)机制Binder简要介
绍和学习计划一文。
以上都是从SurfaceFlinger服务这一侧来理解一个Surface,下面我们再从Android应用程序这一侧来理解一个Surface。
在Android应用程序这一侧,每一个绘图表面都使用一个Surface对象来描述,每一个Surface对象都是由一个SurfaceControl对
象来创建的。Surface类和SurfaceControl类的关系以及实现如图4所示。
图4 Surface类和SurfaceControl类的关系以及实现
SurfaceControl类的成员变量mClient是一个类型为SurfaceComposerClient的强指针,它指向了Android应用程序进程中的一
个SurfaceComposerClient单例对象。在前面Android应用程序与SurfaceFlinger服务的连接过程分析一文中,我们已经看到过
SurfaceComposerClient类的作用了,Android应用程序主要就是通过它来和SurfaceFlinger服务建立连接的,连接的结果就是
得到一个类型为Client的Binder代理对象,保存它的成员变量mClient中。
SurfaceControl类的成员变量mSurface是一个类型为ISurface的强指针,它指向了一个类型为BpSurface的Binder代理对象,
而这个Binder代理对象引用的是一个Layer::SurfaceLayer对象。当Android应用程序请求SurfaceFlinger服务创建一个绘图表面
的时候,SurfaceFlinger服务就会在内部创建一个Layer::SurfaceLayer对象,并且将这个Layer::SurfaceLayer对象的一个
Binder代理对象返回来给Android应用程序,然后Android应用程序再将这个Binder代理对象保存在一个SurfaceControl对象的
成员变量mSurface中。
剩余19页未读,继续阅读
资源评论


weixin_38518006
- 粉丝: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 单片机智能稳压电源的设计方案.doc
- 山西公务员热点大数据时代个人信息安全危机.doc
- 城乡规划中的测绘地理大数据应用探析.docx
- 中国-东盟网络安全合作与发展研究报告.pdf
- 软件开发模型.docx
- 大数据时代下-公共图书馆读者服务模式的发展研究.docx
- 华东交大软件学院6周软件工程实训总结报告-学号-姓名.doc
- 浅析计算机制图在工程测绘中的应用.docx
- 一.百万公众网络学习工程试题及标准答案(满分100分)docx.docx
- 河北大学MATLAB习题答案.doc
- 企业信息安全规划与技术实现-软件技术.doc
- 电气自动化李存义自动化应用方案设计书.doc
- 医院信息系统建设中虚拟化技术的运用.docx
- 物联网技术节水灌溉控制.doc
- 信息办公平台网络优化设计.docx
- 前端工程师项目实训金牌就业班版(Word).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
