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 ,