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

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,