Android 4.0.3 显示系统深入认识
发布时间:2021-11-24 12:10:43 所属栏目:教程 来源:互联网
导读:1. 简介 网上已经有很多兄弟对Android的显示系统做了深入解剖,很是佩服。可最近小弟在研究Android4.0时发现出入比较大,也许是Android4.0的修改比较多吧!因为小弟没有看Android4.0以前的代码。 面对这么复杂一个Android显示系统,如何入手呢? 根据以前的经
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来调用。 ![]() (编辑:牡丹江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐