当前位置:操作系统 > 安卓/Android >>

android su易做图ceflinger研究----Su易做图ce机制

  前一篇文章介绍了android的显示系统,这篇文章中,我们把视角往上层移动一下,研究一下framework是如何与su易做图ceflinger进行业务交互的。如何创建su易做图ce,如何显示窗口等等,所有的这一切都是通过系统服务WindowManagerService与su易做图ceflinger来进行的。
 
    android中的Su易做图ce机制这一块代码写的比较难理解,光叫Su易做图ce的类就有3个,因此本篇文章从两部分来分析,首先,想要理解Su易做图ce机制,还是需要首先理清各个类之间的关系。其次,在理解了整个Su易做图ce机制的类关系之后,到时我们再结合前一篇文章中对显示系统的介绍,研究一下一个Su易做图ce是如何和显示系统建立起联系来的,这个联系主要是指Su易做图ce的显示buffer的存储管理。在下篇文章中,再分析Su易做图ceFlinger是如何将已经存储了窗口图形数据的Su易做图ce Buffer显示到显示系统中。。
 
1. Su易做图ce机制的静态关系
    将这一部分叫做Su易做图ce机制,是有别于Su易做图ceFlinger而言的,android的图形系统中,作为C/S模型两端的WMS和Su易做图ceFlinger是图形系统业务的核心,但是不把WMS和Su易做图ceFlinger中间的这层联系搞清楚的话,是很难理解整个图形系统的,在本文中我将两者之间的这个联系关系称之为Su易做图ce机制,它的主要任务就是创建一个Su易做图ce,ViewRoot在这个Su易做图ce上描绘当前的窗口,Su易做图ceFlinger将这个Su易做图ce flinger(扔)给显示系统将其呈现在硬件设备上。其实这里这个Su易做图ce在不同的模块中是以不同的形态存在的,唯一不变的就是其对应的显示Buffer。
 
 
   
 \
 
 
1.1 ViewRoot和WMS共享Su易做图ce
    我们知道每个Activity都会有一个ViewRoot作为Activity Window与WMS交互的接口,ViewRoot会绘制整个Activity的窗口View到Su易做图ce上,因此我们在ViewRoot中就有了创建Su易做图ce的需求。看一下代码中的Su易做图ce的定义:
relayoutWindow()@ViewRoot.java
 
[java]
<span style="font-size:13px;">    private final Su易做图ce mSu易做图ce = new Su易做图ce();</span> 
Su易做图ce()@Su易做图ce.java
[java]
<span style="font-size:13px;">    public Su易做图ce() { 
        if (DEBUG_RELEASE) { 
            mCreationStack = new Exception(); 
        } 
        mCanvas = new CompatibleCanvas(); 
    }</span> 
    由上面可以看出在ViewRoot中定义的Su易做图ce只是一个空壳,那么真正的Su易做图ce是在哪里被初始化的呢?大管家WMS中!当ViewRoot请求WMS relayout时,会将ViewSu易做图ce中的Su易做图ce交给WMS初始化。在WMS中,对应每个WindowState对象,在relayout窗口时,同样会创建一个Su易做图ce,wms中的这个Su易做图ce会真正的初始化,然后再将这个WMS Su易做图ce复制给ViewRoot中的Su易做图ce。这么实现的目的就是保证ViewRoot和WMS共享同一个Su易做图ce。ViewRoot对Su易做图ce进行绘制,WMS对这个Su易做图ce进行初始化及管理。很和谐!
relayoutWindow()@ViewRoot.java
 
[java]
<span style="font-size:13px;">        int relayoutResult = sWindowSession.relayout( 
                mWindow, params, 
                (int) (mView.mMeasuredWidth * appScale + 0.5f), 
                (int) (mView.mMeasuredHeight * appScale + 0.5f), 
                viewVisibility, insetsPending, mWinFrame, 
                mPendingContentInsets, mPendingVisibleInsets, 
                mPendingConfiguration, mSu易做图ce);</span> 
relayoutWindow()@WindowManagerService.java
[java]
<span style="font-size:13px;">                    Su易做图ce su易做图ce = win.createSu易做图ceLocked(); 
                    if (su易做图ce != null) { 
                        outSu易做图ce.copyFrom(su易做图ce); 
                        win.mReportDestroySu易做图ce = false; 
                        win.mSu易做图cePendingDestroy = false; 
                        if (SHOW_TRANSACTIONS) Slog.i(TAG, 
                                "  OUT SURFACE " + outSu易做图ce + ": copied"); 
                    } else {</span> 
1.2 Su易做图ceSession
    Su易做图ceSession可以认为是创建Su易做图ce过程中,WMS和Su易做图ceFlinger之间的会话层,通过这个Su易做图ceSession实现了Su易做图ce的创建。
 
   \
 
    Su易做图ceSession是JAVA层的概念,@Su易做图ceSession.java。它对应的native实体是一个Su易做图ceComposerClient对象。
 
    Su易做图ceComposerClient通过ComposerService类来获得Su易做图ceFlinger的IBinder接口,但是光获得Su易做图ceFlinger的IBinder接口是不够的,要想请求Su易做图ceFlinger创建一个Su易做图ce,还需要向Su易做图ceFlinger获得一个IBinder接口ISu易做图ceComposerClient,通过这个ISu易做图ceComposerClient来请求Su易做图ceFlinger创建一个Su易做图ce,为什么这么绕呢,为什么不直接让Su易做图ceFlinger创建Su易做图ce呢?
 
    站在Su易做图ceFlinger的角度来考虑,对于Su易做图ceFlinger来说,可能有多个Client来请求Su易做图ceFlinger的业务,每个Client可能会请求Su易做图ceFlinger创建多个Su易做图ce,那么Su易做图ceFlinger本地需要提供一套机制来保存每个client请求创建的Su易做图ce,Su易做图ceFlinger通过为每个client创建一个Client对象实现这个机制,并将这个Client的IBinder接口ISu易做图ceComposerClient返给Su易做图ceComposerClient对象。Su易做图ceComposerClient对象在通过ISu易做图ceComposerClient去请求创建Su易做图ce。
 
@Su易做图ceFlinger.h
 
[cpp]
class Client : public BnSu易做图ceComposerClient 
 
@Su易做图ceComposerClient.cpp
[cpp]
void Su易做图ceComposerClient::onFirstRef() 

    sp<ISu易做图ceComposer> sm(getComposerService()); 
    if (sm != 0) { 
        sp<ISu易做图ceComposerClient> conn = sm->createConnection(); 
        if (conn != 0) { 
            mClient = conn; 
            Composer::addClient(this); 
 &nbs
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,