1、 show/hide: 显示隐藏操作 setSize/setPosition: 设置大小和位置 SetLayer:设置图层 freeze/unfreeze:冻结与去冻结操作,即是否更新屏幕 SetAlpha:设置Alpha通道,即设置透明等级 SetMatrix:设置平移矩阵 setFlags:设置其它标志 这些SurfaceControl类的功能实现仅仅是对SurfaceComposerClient的简单封装。可以通过SurfaceComposerClient的函数获取Display的个数、高、宽、旋转方向以及其它信息。它是通过ComposerService中的控制块信息来实现的。Scree
2、nshotClient包含屏幕截屏宽(mWidth)和高(mHeight)以及像素格式(PixelFormat),截图数据保存在IMemoryHeap中(mHeap)。它是调用ISurfaceComposer的captureScreen函数来实现的。SurfaceSurface类继承自EGLNativeBase模板类,因此它实际上一个ANativeWindow,只不过该模板给它添加了引用计数功能,并可安全地进行类型转换。class Surface: public EGLNativeBase上层应用程序各有自己的surface,因此多个surface会同时存在,这些surface在本侧就是Sur
3、faceComposerClient所代表,它们可以添加到Composer类维护的列表中。SurfaceControl会使用SurfaceClient和Surface去完成相应功能,SurfaceControl的getSurface函数会创建Surface,从而也会导致SurfaceClient的创建,进而相应的ISurfaceClientComposer等会被创建。ISurfaceComposerISurfaceComposer是SurfaceFlinger在client侧的一个binder,提供的接口用于对整个屏幕的全局性的管理,如方向旋转、屏幕快照、屏幕事件、屏幕更新的冻结与去冻结等。它
4、提供的接口对应的枚举类型有:enum / Note: BOOT_FINISHED must remain this value, it is called from/ Java by ActivityManagerService.BOOT_FINISHED = IBinder:FIRST_CALL_TRANSACTION,CREATE_CONNECTION,CREATE_CLIENT_CONNECTION,GET_CBLK,OPEN_GLOBAL_TRANSACTION,CLOSE_GLOBAL_TRANSACTION,SET_ORIENTATION,FREEZE_DISPLAY,UNFREE
5、ZE_DISPLAY,SIGNAL,CAPTURE_SCREEN,TURN_ELECTRON_BEAM_OFF,TURN_ELECTRON_BEAM_ON;它是通过Binder进行IPC通讯的接口,BpSurfaceComposer是client一侧, BnSurfaceComposer是service一侧。它们都继承自各自的模板类BpInterface和BnInterface,这两个模板类完成双重继承的功能,一个继承IPC通讯的API接口,一个继承Binder功能。RefBase用于索引计数,类IInterface和ISurface定义了IPC通讯的接口API,IBinder/BBinder
6、使双方具备Binder通讯功能。其中CREATE_CONNECTION和REATE_CLIENT_CONNECTION打开关闭一个Transaction,在打开和关闭的过程中,可以设置状态,实现窗口管理。状态变化更改是在一个事务(transaction)中进行的。其类继承关系如下:根据Binder继承关系规则,client侧的接口调用通过最终是由Bn侧的子类完成。我们就可以知道它的它动态的调用关系如下,左侧的调用者一般可以通过指向ISurfaceComposer的智能指针将操作将调用到SurfaceFlinger类的成员函数。ComposerService对IsurfaceComposer进行
7、了包裹,使用它的getComposerService函数可以获取IsurfaceComposer。另外,ComposerService还包含了surface_flinger_cblk_t控制块信息,该内存块位于Ashem内存上,由SurfaceFlinger申请,并依据display硬件信息填充字段值。client端程序通过读取它,即可得到各display的信息。struct display_cblk_t/dispaly的各项信息uint16_t w;uint16_t h;uint8_t format;uint8_t orientation;uint8_t reserved2;float fp
8、s;float density;float xdpi;float ydpi;uint32_t pad2;struct surface_flinger_cblk_t / 4KB max/控制信息块uint8_t connected;uint8_t reserved3;uint32_t pad7;display_cblk_t displaysSharedBufferStack:NUM_DISPLAY_MAX;/最多4个display在SufraceFlinger的readyToRun会申请内存,并依据DisplayHardWare中得到display信息:/ create the shared c
9、ontrol-blockmServerHeap = new MemoryHeapBase(4096,MemoryHeapBase:READ_ONLY, “SurfaceFlinger read-only heap”);/分配内存,没有指定设备名称或描述符fd,默认使用AShem上的内存LOGE_IF(mServerHeap=0, “cant create shared memory dealer”);mServerCblk = /得到内存基址static_cast(mServerHeap-getBase();LOGE_IF(mServerCblk=0, “cant get to shared
10、control blocks address”);new(mServerCblk) surface_flinger_cblk_t;/ initialize primary screen/ (other display should be initialized in the same manner, but / asynchronously, as they could come and go. None of this is supported yet).const GraphicPlane& plane(graphicPlane(dpy);const DisplayHardware& hw
11、 = plane.displayHardware();const uint32_t w = hw.getWidth();const uint32_t h = hw.getHeight();const uint32_t f = hw.getFormat();hw.makeCurrent();/ initialize the shared control blockmServerCblk-connected |= 1displays + dpy;memset(dcblk, 0, sizeof(display_cblk_t);/给结构体赋值,同一块内存上,client侧可以立即得到dcblk-w =
12、 plane.getWidth();h = plane.getHeight();format = f;orientation = ISurfaceComposer:eOrientationDefault;xdpi = hw.getDpiX();ydpi = hw.getDpiY();fps = hw.getRefreshRate();density = hw.getDensity();IsurfaceComposerClientISurfaceComposerClient用于通过Binder与SurfaceFlinger交互,创建和销毁ISurface,它也可以获取控制块。在SurfaceFl
13、inger侧会有两种类型的surface:Client(用于创建销毁ISurace)和UserClient(用于获取控制块进行通讯)。它提供的接口对应的枚举类型如下:GET_CBLK = IBinder:GET_TOKEN,CREATE_SURFACE,DESTROY_SURFACE,SET_STATE动态调用关系图,调用者通过对IsurfaceComposerClient的引用,最后由SufaceFlinger进程中的Client或UserClient来完成:ISurfaceIsurface提供了一个与SufaceFlinger侧进行IPC交互的接口,它主要功能是操作缓冲区。我们可以从ISu
14、rface这个纯虚类中看出起定义的接口操作:REGISTER_BUFFERS = IBinder:UNREGISTER_BUFFERS,POST_BUFFER, / one-way transactionCREATE_OVERLAY,REQUEST_BUFFER,SET_BUFFER_COUNT,这些枚举就是所支持的接口操作,相应地对应着纯虚成员函数。我们可以望文生义理解其含义。如下图,BpSurface是client一侧, BnSurface是service一侧。类继承关系图动态调用关系如下图所示:spSurface flinger制块在文件SharedBufferStack.h中定义了一个
15、结构体,它是为了通过共享内存的方式快速获取系统所有display物理信息,这个控制块由结构体surface_flinger_cblk_t定义:struct display_cblk_t/显示控制块,Android中默认支持最多4个diaplay /display的宽 /display的高 /格式 /旋转方向 /保留字节 /刷新率 /密度/x方向上的解析度,每英寸的点阵数(dots/inch)/y方向上的解析度/填充字节/是否连接/保留字节/支持最多4个的displayJava层在创建一个SurfaceSession实例时,建立到server侧的连接,这个连接的动作实际就是分配内存、创建surf
16、ace_flinger_cblk_t对象并初始化获得初始值、以及可以跨进程访问的过程。具体过程是:在client一侧,创建Surface Session时,会创建一个SurfaceComposerClient对象,接着会调用SurfaceComposerClient:onFirstRef:void SurfaceComposerClient:onFirstRef()/第一次创建对象时被调用ISurfaceComposer sm(getComposerService();/导致获取全局控制块if (sm != 0) ISurfaceComposerClient conn = sm-createC
17、onnection();/创建一个连接,surface flinger侧会创建一个Client对象if (conn !mClient = conn;Composer:addClient(this);mPrebuiltLayerState = new layer_state_t;mStatus = NO_ERROR;在上面的代码中,先在ComposerService的构造函数中获取surface flinger控制块。ComposerService(也就是ISurfaceComposer的Wrapper)构造函数获取surface flinger控制块的过程如下:ComposerService:
18、ComposerService() Singleton() const String16 name(“SurfaceFlinger”);while (getService(name, &mComposerService) != NO_ERROR) usleep(250000);mServerCblkMemory = mComposerService-getCblk();/获取IMemoryHeapmServerCblk = static_cast(mServerCblkMemory-/在IMemoryHeap中的基址指针转换为surface_flinger_cblk_t指针另外,Surface
19、ComposerClient的onFirstRef会创建一个connection,它的目的是创建代理对象,用于Binder IPC通讯,ISurfaceComposerClient接口强指针指向该代理对象。在server侧,它只是调用Client(也就是ISurfaceComposerClient接口在server侧的真正实现者)构造函数创建一个Client对象进行类型转换后返回。而实际的内存分配是在server侧创建SurfaceFlinger后准备运行其工作线程时完成的,见SurfaceFlinger:readyToRun函数:status_t SurfaceFlinger:readyTo
20、Run()LOGI( “SurfaceFlingers main thread ready to run. ”“Initializing graphics H/W”);/ we only support one display currentlyint dpy = 0;/ initialize the main displayGraphicPlane&DisplayHardware* const hw = new DisplayHardware(this, dpy);plane.setDisplayHardware(hw);/创建共享控制块,因未指定在何处分配内存,默认的是ashmem上 (mServerHeap-/获取基址/ (other display should be initialized in the same manner, but/ asynchronously, as they could come and go. None of this is supported yet)./下面是为共享控制块赋值/省略部分代码它为该控制块在ashmem上分配内存并对其初始化赋值。SharedClient控制块