当前位置:操作系统 > 安卓/Android >>

Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

     前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了SurfaceFlinger服务。有了这些预备知识之后,我们就可以从正面来分析SurfaceFlinger服务的实现原理了。SurfaceFlinger服务负责管理系统的帧缓冲区设备,并且负责渲染系统的UI,即各个应用程序的UI。在本文中,我们就简要介绍SurfaceFlinger服务,并且制定学习计划。

        在前面Android应用程序与SurfaceFlinger服务的关系概述和学习计划一系列的文章中提到,SurfaceFlinger服务运行在System进程中,用来统一管理系统的帧缓冲区设备。由于SurfaceFlinger服务运行在System进程中,因此,Android应用程序就需要通过Binder进程间通信机制来请求它来渲染自己的UI。Android应用程序请求SurfaceFlinger服务渲染自己的UI可以分为三步曲:首先是创建一个到SurfaceFlinger服务的连接,接着再通过这个连接来创建一个Surface,最后请求SurfaceFlinger服务渲染该Surface。

       由于SurfaceFlinger服务需要与Android应用程序执行Binder进程间通信,因此,它本身就是一个Binder本地对象,如图1所示:

 

图1 SurfaceFlinger服务的类关系图

        理解这个图需要学习Binder进程间通信机制,具体可以参考Android进程间通信(IPC)机制Binder简要介绍和学习计划这一系列的文章。

        SurfaceFlinger服务实现的接口为ISurfaceComposer,后者定义在文件frameworks/base/include/surfaceflinger/ISurfaceComposer.h中,如下所示:

[cpp] 
class ISurfaceComposer : public IInterface 

public: 
    DECLARE_META_INTERFACE(SurfaceComposer); 
    ...... 
 
    /* create connection with surface flinger, requires
     * ACCESS_SURFACE_FLINGER permission
     */ 
    virtual sp<ISurfaceComposerClient> createConnection() = 0; 
 
    /* create a client connection with surface flinger
     */ 
    virtual sp<ISurfaceComposerClient> 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 surfaceflinger that there might be some work to do
     * This is an ASYNCHRONOUS call.
     */ 
    virtual void signal() const = 0; 
}; 
        ISurfaceComposer接口有13个成员函数,下面我们就简单介绍一下:
        --createConnection:Android应用程序通过它来请求SurfaceFlinger服务建立一个连接,具体可以参考Android应用程序与SurfaceFlinger服务的连接过程分析一文。

        --createClientConnection:Android应用程序通过它来请求SurfaceFlinger服务创建一块共享UI元数据缓冲区,具体可以参考Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析一文。

        --getCblk:Android应用程序通过它来请求SurfaceFlinger服务返回一块匿名共享内存,返回的匿名共享内存包含了设备显示屏的信息,例如,宽度和高度信息。

        --openGlobalTransaction:Android应用程序通过它请求SurfaceFlinger服务来增加一个全局Transaction计数,用来批量修改UI属性信息。注意,这些被修改的UI属性信息会被缓存起来,不会马上生效。要使得这些被修改的UI属性信息生效,需要调用另外一个成员函数closeGlobalTransaction,如下所述。

        --closeGlobalTransaction:Android应用程序通过它请求SurfaceFlinger服务来减少一个全局Transaction计数。当这个全局Transaction计数减少至0的时候,前面通过openGlobalTransaction来请求修改的UI属性信息就会马上生效。

        --freezeDisplay:Android应用程序通过它来请求SurfaceFlinger服务来冻结屏幕。屏幕在被冻结期间,所有UI渲染操作都会被缓存起来,等待被执行。

        --unfreezeDisplay:Android应用程序通过它来请求SurfaceFlinger服务来解冻屏幕。屏幕被解冻之后,SurfaceFlinger服务就可以执行UI渲染操作了。

        --setOrientation:Android应用程序通过它来请求SurfaceFlinger服务设备屏幕的旋转方向。

        --bootFinished:WindowManagerService通过它来告诉SurfaceFlinger服务,系统启动完成了,这时候SurfaceFlinger服务就会停止执行开机动画,具体可以参考Android系统的开机画面显示过程分析一文。

        --captureScreen:Android应用程序通过它来请求SurfaceFlinger服务截取屏幕图像。

        --turnElectronBeamOff:Android应用程序通过它来请求SurfaceFlinger服务关闭屏幕。

        --turnElectronBeamOn:Android应用程序通过它来请求SurfaceFlinger服务点亮屏幕。

        --signal:Android应用程序通过它来请求SurfaceFlinger服务渲染UI,具体可以参考Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析一文。

        理解了ISurfaceComposer接口的定义之后,我们再来看SurfaceFlinger服务的Binder代理对象BpSurfaceComposer的实现,如图2所示:

 

图2 SurfaceFlinger服务的Binder代理对象的类关系图

        理解这个图同样需要学习Binder进程间通信机制,具体可以参考Android进程间通信(IPC)机制Binder简要介绍和学习计划这一系列的文章。

        Android应用程序获得了SurfaceFlinger服务的一个Binder代理对象,即一个BpSurfaceComposer对象之后,就可以请求SurfaceFlinger服务来创建以及渲染自己的UI了。

        接下来,我们再简单介绍一下SurfaceFlinger类的定义,如图3所示:

 

图3 SurfaceFlinger类的定义

       

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,