Android系统Su易做图ce机制的Su易做图ceFlinger服务简要介绍和学习计划
前面我们从Android应用程序与Su易做图ceFlinger服务的关系出发,从侧面简单学习了Su易做图ceFlinger服务。有了这些预备知识之后,我们就可以从正面来分析Su易做图ceFlinger服务的实现原理了。Su易做图ceFlinger服务负责管理系统的帧缓冲区设备,并且负责渲染系统的UI,即各个应用程序的UI。在本文中,我们就简要介绍Su易做图ceFlinger服务,并且制定学习计划。
在前面Android应用程序与Su易做图ceFlinger服务的关系概述和学习计划一系列的文章中提到,Su易做图ceFlinger服务运行在System进程中,用来统一管理系统的帧缓冲区设备。由于Su易做图ceFlinger服务运行在System进程中,因此,Android应用程序就需要通过Binder进程间通信机制来请求它来渲染自己的UI。Android应用程序请求Su易做图ceFlinger服务渲染自己的UI可以分为三步曲:首先是创建一个到Su易做图ceFlinger服务的连接,接着再通过这个连接来创建一个Su易做图ce,最后请求Su易做图ceFlinger服务渲染该Su易做图ce。
由于Su易做图ceFlinger服务需要与Android应用程序执行Binder进程间通信,因此,它本身就是一个Binder本地对象,如图1所示:
图1 Su易做图ceFlinger服务的类关系图
理解这个图需要学习Binder进程间通信机制,具体可以参考Android进程间通信(IPC)机制Binder简要介绍和学习计划这一系列的文章。
Su易做图ceFlinger服务实现的接口为ISu易做图ceComposer,后者定义在文件frameworks/base/include/su易做图ceflinger/ISu易做图ceComposer.h中,如下所示:
[cpp]
class ISu易做图ceComposer : public IInte易做图ce
{
public:
DECLARE_META_INTERFACE(Su易做图ceComposer);
......
/* create connection with su易做图ce flinger, requires
* ACCESS_SURFACE_FLINGER permission
*/
virtual sp<ISu易做图ceComposerClient> createConnection() = 0;
/* create a client connection with su易做图ce flinger
*/
virtual sp<ISu易做图ceComposerClient> createClientConnection() = 0;
/* retrieve the control block */
virtual sp<IMemoryHeap> getCblk() const = 0;
/* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
virtual void openGlobalTransaction() = 0;
virtual void closeGlobalTransaction() = 0;
/* [un]freeze display. requires ACCESS_SURFACE_FLINGER permission */
virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) = 0;
virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags) = 0;
/* Set display orientation. requires ACCESS_SURFACE_FLINGER permission */
virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags) = 0;
/* signal that we're done booting.
* Requires ACCESS_SURFACE_FLINGER permission
*/
virtual void bootFinished() = 0;
/* Capture the specified screen. requires READ_FRAME_BUFFER permission
* This function will fail if there is a secure window on screen.
*/
virtual status_t captureScreen(DisplayID dpy,
sp<IMemoryHeap>* heap,
uint32_t* width, uint32_t* height, PixelFormat* format,
uint32_t reqWidth, uint32_t reqHeight) = 0;
virtual status_t turnElectronBeamOff(int32_t mode) = 0;
virtual status_t turnElectronBeamOn(int32_t mode) = 0;
/* Signal su易做图ceflinger that there might be some work to do
* This is an ASYNCHRONOUS call.
*/
virtual void signal() const = 0;
};
ISu易做图ceComposer接口有13个成员函数,下面我们就简单介绍一下:
--createConnection:Android应用程序通过它来请求Su易做图ceFlinger服务建立一个连接,具体可以参考Android应用程序与Su易做图ceFlinger服务的连接过程分析一文。
--createClientConnection:Android应用程序通过它来请求Su易做图ceFlinger服务创建一块共享UI元数据缓冲区,具体可以参考Android应用程序与Su易做图ceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析一文。
--getCblk:Android应用程序通过它来请求Su易做图ceFlinger服务返回一块匿名共享内存,返回的匿名共享内存包含了设备显示屏的信息,例如,宽度和高度信息。
--openGlobalTransaction:Android应用程序通过它请求Su易做图ceFlinger服务来增加一个全局Transaction计数,用来批量修改UI属性信息。注意,这些被修改的UI属性信息会被缓存起来,不会马上生效。要使得这些被修改的UI属性信息生效,需要调用另外一个成员函数closeGlobalTransaction,如下所述。
--closeGlobalTransaction:Android应用程序通过它请求Su易做图ceFlinger服务来减少一个全局Transaction计数。当这个全局Transaction计数减少至0的时候,前面通过openGlobalTransaction来请求修改的UI属性信息就会马上生效。
--freezeDisplay:Android应用程序通过它来请求Su易做图ceFlinger服务来冻结屏幕。屏幕在被冻结期间,所有UI渲染操作都会被缓存起来,等待被执行。
--unfreezeDisplay:Android应用程序通过它来请求Su易做图ceFlinger服务来解冻屏幕。屏幕被解冻之后,Su易做图ceFlinger服务就可以执行UI渲染操作了。
--setOrientation:Android应用程序通过它来请求Su易做图ceFlinger服务设备屏幕的旋转方向。
--bootFinished:WindowManagerService通过它来告诉Su易做图ceFlinger服务,系统启动完成了,这时候Su易做图ceFlinger服务就会停止执行开机动画,具体可以参考Android系统的开机画面显示过程分析一文。
--captureScreen:Android应用程序通过它来请求Su易做图ceFlinger服务截取屏幕图像。
--turnElectronBeamOff:Android应用程序通过它来请求Su易做图ceFlinger服务关闭屏幕。
--turnElectronBeamOn:Android应用程序通过它来请求Su易做图ceFlinger服务点亮屏幕。
--signal:Android应用程序通过它来请求Su易做图ceFlinger服务渲染UI,具体可以参考Android应用程序请求Su易做图ceFlinger服务渲染Su易做图ce的过程分析一文。
理解了ISu易做图ceComposer接口的定义之后,我们再来看Su易做图ceFlinger服务的Binder代理对象BpSu易做图ceComposer的实现,如图2所示:
图2 Su易做图ceFlinger服务的Binder代理对象的类关系图
理解这个图同样需要学习Binder进程间通信机制,具体可以参考Android进程间通信(IPC)机制Binder简要介绍和学习计划这一系列的文章。
Android应用程序获得了Su易做图ceFlinger服务的一个Binder代理对象,即一个BpSu易做图ceComposer对象之后,就可以请求Su易做图ceFlinger服务来创建以及渲染自己的UI了。
接下来,我们再简单介绍一下Su易做图ceFlinger类的定义,如图3所示:
图3 Su易做图ceFlinger类的定义
补充:移动开发 , Android ,