1. 简介
网上已经有很多兄弟对Android的显示系统做了深入解剖,很是佩服。可最近小弟在研究Android4.0时发现出入比较大,也许是Android4.0的修改比较多吧!因为小弟没有看Android4.0以前的代码。
面对这么复杂一个Android显示系统,如何入手呢? 根据以前的经验,不管它有多么复杂,其功能不就是以下三步曲吗?
1)显示系统的创建及初始化
2)画图
3)销毁
哪我的分析就从显示系统的创建及初始化开始吧!由于小弟对Java没有什么研究兴趣,所有重点就分析Native部分。当然Native的入口就在android_view_Surface.cpp中,此文件主要包含以下两部分给Java层调用:
1)gSurfaceSessionMethods: 操作SurfaceSession的方法
2)gSurfaceMethods:操作Surface的方法
2. android_view_Surface.cpp
2.1 SurfaceSession操作方法
- static JNINativeMethod gSurfaceSessionMethods[] = {
- {"init", "()V", (void*)SurfaceSession_init }, //创建SurfaceComposerClient
- {"destroy", "()V", (void*)SurfaceSession_destroy }, //直接销毁SurfaceComposerClient
- {"kill", "()V", (void*)SurfaceSession_kill },//先clear,再销毁SurfaceComposerClient
- };
2.1.1 SurfaceSession_init
其功能如下:
1)创建SurfaceComposerClient对象
2)调用SurfaceComposerClient::onFirstRef方法
现在已经进入到SurfaceComposerClient的地盘,根据其名字含义,它应该是一个进行Surface合成的客户端,通过它发命令给SurfaceFlinger来进行需要的操作。其初始化流程如下图所示:

2.1.2 SurfaceComposerClient.cpp中的宝贝
为了方便后面的理解,先看看SurfaceComposerClient中有些什么宝贝来完成这个任务。在其中定义了如下几个类:
2.1.2.1 ComposerService(获取SurfaceFlinger服务)
一看到名字为Service,应该是用于从SurfaceFlinger中获取Service以建立连接关系<它是一个单实例,一个进程有且只有一个实例对象>,然后供后面进行相关的操作。其构造函数代码如下:
- class ComposerService : public Singleton<ComposerService>
- {
- //实质为BpSurfaceComposer,通过它与SurfaceFlinger进行通信,
- //BnSurfaceComposer是SurfaceFlinger基类中的一个
- sp<ISurfaceComposer> mComposerService;
-
- //实质为BpMemoryHeap,它在SurfaceFlinger中对应为管理一个4096字节的
- //一个MemoryHeapBase对象,在SurfaceFlinger::readyToRun中创建
- sp<IMemoryHeap> mServerCblkMemory;
-
- //为MemoryHeapBase管理的内存在用户空间的基地址,通过mmap而来,
- //具体见MemoryHeapBase::mapfd
- surface_flinger_cblk_t volatile* mServerCblk;
- ComposerService();
- friend class Singleton<ComposerService>;
- public:
- static sp<ISurfaceComposer> getComposerService();
- static surface_flinger_cblk_t const volatile * getControlBlock();
- };
-
- ComposerService::ComposerService()
- : Singleton<ComposerService>() {
- const String16 name("SurfaceFlinger");
- //获取SurfaceFlinger服务,即BpSurfaceComposer对象
- while (getService(name, &mComposerService) != NO_ERROR) {
- usleep(250000);
- }
- //获取共享内存块
- mServerCblkMemory = mComposerService->getCblk();
- //获取共享内存块基地址
- mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(
- mServerCblkMemory->getBase());
- }
由此可见,ComposerService主要是获取SurfaceFlinger服务、获取在SurfaceFlinger::readyToRun中创建的共享内存块及其基地址。在Client中,谁要想与SurfaceFlinger通信,需要通过接口getComposerService来获取此BpSurfaceComposer。
此ComposerService是在调用ComposerService::getInstance时进行有且只有一个的实例化,因为前面讲过,它是一个单实例。
2.1.2.2 Composer
它也是一个单实例,管理并发送每个layer的ComposerState。其定义如下:
- struct ComposerState {
- sp<ISurfaceComposerClient> client;
- layer_state_t state;
- status_t write(Parcel& output) const;
- status_t read(const Parcel& input);
- };
-
- class Composer : public Singleton<Composer>
- {
- friend class Singleton<Composer>;
-
- mutable Mutex mLock;
- //SurfaceComposerClient+SurfaceID与一个ComposerState一一对应
- SortedVector<ComposerState> mStates;
- int mOrientation;//整个屏幕的方向
- Composer() : Singleton<Composer>(),
- mOrientation(ISurfaceComposer::eOrientationUnchanged) { }
- //通过BpSurfaceComposer把mStates发送给SurfaceFlinger处理
- void closeGlobalTransactionImpl();
-
- //根据client和id从mStates中获取对应原ComposerState,从而获取对应的layer_state_t
- layer_state_t* getLayerStateLocked(
- const sp<SurfaceComposerClient>& client, SurfaceID id);
-
- public:
- //设置与client和id对应的layer_state_t中的位置信息,并保存在mStates中
- status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id,
- float x, float y);
- //设置与client和id对应的layer_state_t中的Size信息,并保存在mStates中
- status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id,
- uint32_t w, uint32_t h);
- //设置与client和id对应的layer_state_t中的z-order信息,并保存在mStates中
- status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id,
- int32_t z);
- //设置与client和id对应的layer_state_t中的flags信息,并保存在mStates中
- status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id,
- uint32_t flags, uint32_t mask);
- //设置与client和id对应的layer_state_t中的透明区域信息,并保存在mStates中
- status_t setTransparentRegionHint(
- const sp<SurfaceComposerClient>& client, SurfaceID id,
- const Region& transparentRegion);
- //设置与client和id对应的layer_state_t中的alpha信息,并保存在mStates中
- status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id,
- float alpha);
- //设置与client和id对应的layer_state_t中的矩阵信息,并保存在mStates中
- status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id,
- float dsdx, float dtdx, float dsdy, float dtdy);
- //设置与client和id对应的layer_state_t中的位置信息,并保存在mStates中
- status_t setFreezeTint(
- const sp<SurfaceComposerClient>& client, SurfaceID id,
- uint32_t tint);
- //设置整个屏幕的方向
- status_t setOrientation(int orientation);
- //通过BpSurfaceComposer把mStates发送给SurfaceFlinger处理
- static void closeGlobalTransaction() {
- Composer::getInstance().closeGlobalTransactionImpl();
- }
- }
把上面的comments看完就明白了,Composer管理每个SurfaceComposerClient中的每一个Surface的状态,并记录在ComposerState的layer_state_t中,然后调用者可以调用其closeGlobalTransaction方法把这些mStates发送给SurfaceFlinger处理(处理函数为:SurfaceFlinger::setTransactionState)。
谁来调用它的方法设置层的属性及发送mStates呢? -----答案是由SurfaceComposerClient来调用。
|