加入收藏 | 设为首页 | 会员中心 | 我要投稿 牡丹江站长网 (https://www.0453zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

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来调用。

(编辑:牡丹江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!