Android 4.0.3 显示系统深入理解


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操作方法

  1. static JNINativeMethod gSurfaceSessionMethods[] = {    
  2.     {"init",     "()V",  (void*)SurfaceSession_init }, //创建SurfaceComposerClient    
  3.     {"destroy",  "()V",  (void*)SurfaceSession_destroy }, //直接销毁SurfaceComposerClient    
  4.     {"kill",     "()V",  (void*)SurfaceSession_kill },//先clear,再销毁SurfaceComposerClient   
  5. };    

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以建立连接关系<它是一个单实例,一个进程有且只有一个实例对象>,然后供后面进行相关的操作。其构造函数代码如下:      

  1. class ComposerService : public Singleton<ComposerService>  
  2. {  
  3.     //实质为BpSurfaceComposer,通过它与SurfaceFlinger进行通信,   
  4.     //BnSurfaceComposer是SurfaceFlinger基类中的一个   
  5.     sp<ISurfaceComposer> mComposerService;  
  6.   
  7.     //实质为BpMemoryHeap,它在SurfaceFlinger中对应为管理一个4096字节的   
  8.     //一个MemoryHeapBase对象,在SurfaceFlinger::readyToRun中创建   
  9.     sp<IMemoryHeap> mServerCblkMemory;  
  10.       
  11.     //为MemoryHeapBase管理的内存在用户空间的基地址,通过mmap而来,   
  12.     //具体见MemoryHeapBase::mapfd   
  13.     surface_flinger_cblk_t volatile* mServerCblk;  
  14.     ComposerService();  
  15.     friend class Singleton<ComposerService>;  
  16. public:  
  17.     static sp<ISurfaceComposer> getComposerService();  
  18.     static surface_flinger_cblk_t const volatile * getControlBlock();  
  19. };  
  20.   
  21. ComposerService::ComposerService()  
  22. : Singleton<ComposerService>() {  
  23.     const String16 name("SurfaceFlinger");  
  24.     //获取SurfaceFlinger服务,即BpSurfaceComposer对象   
  25.     while (getService(name, &mComposerService) != NO_ERROR) {  
  26.         usleep(250000);  
  27.     }  
  28.     //获取共享内存块   
  29.     mServerCblkMemory = mComposerService->getCblk();  
  30.     //获取共享内存块基地址   
  31.     mServerCblk = static_cast<surface_flinger_cblk_t volatile *>(  
  32.             mServerCblkMemory->getBase());  
  33. }  

      由此可见,ComposerService主要是获取SurfaceFlinger服务、获取在SurfaceFlinger::readyToRun中创建的共享内存块及其基地址。在Client中,谁要想与SurfaceFlinger通信,需要通过接口getComposerService来获取此BpSurfaceComposer

     此ComposerService是在调用ComposerService::getInstance时进行有且只有一个的实例化,因为前面讲过,它是一个单实例。

 

2.1.2.2 Composer

      它也是一个单实例,管理并发送每个layer的ComposerState。其定义如下:

  1. struct ComposerState {  
  2.     sp<ISurfaceComposerClient> client;  
  3.     layer_state_t state;  
  4.     status_t    write(Parcel& output) const;  
  5.     status_t    read(const Parcel& input);  
  6. };  
  7.   
  8. class Composer : public Singleton<Composer>  
  9. {  
  10.     friend class Singleton<Composer>;  
  11.   
  12.     mutable Mutex               mLock;  
  13.     //SurfaceComposerClient+SurfaceID与一个ComposerState一一对应   
  14.     SortedVector<ComposerState> mStates;       
  15.     int                         mOrientation;//整个屏幕的方向   
  16.     Composer() : Singleton<Composer>(),  
  17.         mOrientation(ISurfaceComposer::eOrientationUnchanged) { }  
  18.     //通过BpSurfaceComposer把mStates发送给SurfaceFlinger处理   
  19.     void closeGlobalTransactionImpl();  
  20.   
  21.     //根据client和id从mStates中获取对应原ComposerState,从而获取对应的layer_state_t   
  22.     layer_state_t* getLayerStateLocked(  
  23.             const sp<SurfaceComposerClient>& client, SurfaceID id);  
  24.   
  25. public:  
  26.     //设置与client和id对应的layer_state_t中的位置信息,并保存在mStates中   
  27.     status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id,  
  28.             float x, float y);  
  29.     //设置与client和id对应的layer_state_t中的Size信息,并保存在mStates中   
  30.     status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id,  
  31.             uint32_t w, uint32_t h);  
  32.     //设置与client和id对应的layer_state_t中的z-order信息,并保存在mStates中   
  33.     status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id,  
  34.             int32_t z);  
  35.     //设置与client和id对应的layer_state_t中的flags信息,并保存在mStates中   
  36.     status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id,  
  37.             uint32_t flags, uint32_t mask);  
  38.     //设置与client和id对应的layer_state_t中的透明区域信息,并保存在mStates中   
  39.     status_t setTransparentRegionHint(  
  40.             const sp<SurfaceComposerClient>& client, SurfaceID id,  
  41.             const Region& transparentRegion);  
  42.     //设置与client和id对应的layer_state_t中的alpha信息,并保存在mStates中   
  43.     status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id,  
  44.             float alpha);  
  45.     //设置与client和id对应的layer_state_t中的矩阵信息,并保存在mStates中   
  46.     status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id,  
  47.             float dsdx, float dtdx, float dsdy, float dtdy);  
  48.     //设置与client和id对应的layer_state_t中的位置信息,并保存在mStates中   
  49.     status_t setFreezeTint(  
  50.             const sp<SurfaceComposerClient>& client, SurfaceID id,  
  51.             uint32_t tint);  
  52.     //设置整个屏幕的方向   
  53.     status_t setOrientation(int orientation);  
  54.     //通过BpSurfaceComposer把mStates发送给SurfaceFlinger处理   
  55.     static void closeGlobalTransaction() {  
  56.         Composer::getInstance().closeGlobalTransactionImpl();  
  57.     }  
  58. }  

      把上面的comments看完就明白了,Composer管理每个SurfaceComposerClient中的每一个Surface的状态,并记录在ComposerState的layer_state_t中,然后调用者可以调用其closeGlobalTransaction方法把这些mStates发送给SurfaceFlinger处理(处理函数为:SurfaceFlinger::setTransactionState)。

      谁来调用它的方法设置层的属性及发送mStates呢? -----答案是由SurfaceComposerClient来调用。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 下一页

相关内容