1 前言

        View添加过程 中介绍了从 WindowManagerImpl 的 addView() 方法到 WindowState、SurfaceSession 的创建流程,本文将介绍 Surface 的创建流程。应用进程中,ViewRootImpl 持有 Surface 对象,system_server 进程中,WindowSurfaceController 持有 SurfaceControl 对象,Surface 和 SurfaceControl 都持有 native 层的同一个 Surface 对象的地址(SurfaceFlinger 进程)。

        Surface 在应用进程和 system_server 进程中都有创建,因此,本文主要介绍 system_server 进程中 SurfaceControl 的创建流程和应用进程中 Surface 的创建流程。

为区分不同进程,将应用进程、system_server 进程分别标识为浅蓝色、深蓝色。

2 源码分析

2.1 ViewRootImpl 到 Session

        如图,浅蓝色的类是应用进程中执行的,深蓝色的类是在 system_server 进程中执行的,黄色的类是指 AIDL 文件生成的接口(用于跨进程)。

Android SurfaceView设置第一针 android surface创建_View显示流程

        (1)ViewRootImpl

        /frameworks/base/core/java/android/view/ViewRootImpl.java

public final Surface mSurface = new Surface();
private final SurfaceControl mSurfaceControl = new SurfaceControl();

public ViewRootImpl(Context context, Display display) {
	mContext = context;
    //IWindowSession 类型,单例对象,getWindowSession() 方法调用 WMS 的 openSession() 方法,new 一个 Session 对象(IWindowSession.Stub 的实现类)
	mWindowSession = WindowManagerGlobal.getWindowSession(); 
	mDisplay = display;
	...
	mWindow = new W(this); //IWindow.Stub 的实现类
	...
    mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this, context); //View.AttachInfo 类型
    ...
    mChoreographer = Choreographer.getInstance();
	mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
    ...
}

        说明:Session 是 IWindowSession.Stub 的实现类,属于 WMS 端的类,WindowManagerGlobal.getWindowSession() 方法最终会调用 WMS 的 openSession() 方法,创建一个 Session 对象,每个应用进程,最多对应一个 Session 对象;W 类是 ViewRootImpl 的内部类,也是 IWindow.Stub 的实现类,每个 根 View 都与一个 W 一一对应,即 mWindow.asBinder() 可以作为 根 View (或窗口)的身份标识。

        (2)setView

        /frameworks/base/core/java/android/view/ViewRootImpl.java

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
	synchronized (this) {
		if (mView == null) {
			mView = view;
            ...
			mWindowAttributes.copyFrom(attrs);
			...
			mAttachInfo.mRootView = view;
			...
			if (panelParentView != null) {
				mAttachInfo.mPanelParentWindowToken = panelParentView.getApplicationWindowToken();
			}
			...
            //请求显示 View
            requestLayout();
            ...
			try {
				...
                //添加 View
				res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes, getHostVisibility(), 
					mDisplay.getDisplayId(), mTmpFrame, mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, 
					mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel, mTempInsets);
				setFrame(mTmpFrame);
			}
			...
		}
	}
}

        mWindowSession.addToDisplay() 的执行流程在 View添加过程 中已做介绍,接下来跟踪 requestLayout() 的执行流程。 

        (3)requestLayout

        /frameworks/base/core/java/android/view/ViewRootImpl.java

public void requestLayout() {
	if (!mHandlingLayoutInLayoutRequest) {
		...
		scheduleTraversals();
	}
}

        (4)scheduleTraversals

        /frameworks/base/core/java/android/view/ViewRootImpl.java

void scheduleTraversals() {
	if (!mTraversalScheduled) {
		...
		mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
		...
	}
}

final class TraversalRunnable implements Runnable {
	public void run() {
		doTraversal();
	}
}

final TraversalRunnable mTraversalRunnable = new TraversalRunnable();

         Choreographer 通过消息处理,最终调用 mTraversalRunnable 的 run() 方法,其中又会调用 doTraversal() 方法。

        (5)doTraversal

        /frameworks/base/core/java/android/view/ViewRootImpl.java

void doTraversal() {
	if (mTraversalScheduled) {
		...
		performTraversals();
		...
	}
}

        (6)performTraversals

        /frameworks/base/core/java/android/view/ViewRootImpl.java

private void performTraversals() {
	...
	if (mFirst || windowShouldResize || insetsChanged || viewVisibilityChanged || params != null || mForceNextWindowRelayout) {
		...
		try {
			...
            //mWindowSession.relayout()
			relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
			...
		}
		...
	}
	...
	if (didLayout) {
		//view.requestLayout()
		performLayout(lp, mWidth, mHeight);
		...
	}
	...
	if (!cancelDraw) {
		...
		//开始绘制:draw(fullRedrawNeeded)
		performDraw();
	}
	...
}

        (7)relayoutWindow

        /frameworks/base/core/java/android/view/ViewRootImpl.java

private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility, boolean insetsPending) throws RemoteException {
	...
	int relayoutResult = mWindowSession.relayout(mWindow, mSeq, params, (int) (mView.getMeasuredWidth() * appScale + 0.5f),
			(int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, 
			frameNumber, mTmpFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets, mPendingStableInsets, 
			mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout, mPendingMergedConfiguration, mSurfaceControl, mTempInsets);
	if (mSurfaceControl.isValid()) {
		//复制 Surface:mNativeObject = nativeGetFromSurfaceControl(mNativeObject, other.mNativeObject)
		mSurface.copyFrom(mSurfaceControl);
	}
	...
}

        说明: mSurfaceControl 对象传递给 mWindowSession.relayout() 方法,最终在 WindowSurfaceController 的 getSurfaceControl() 方法中完成初始化。初始化后的 SurfaceControl 持有 native 层的 Surface 对象地址。mSurface.copyFrom() 方法从 SurfaceControl 中复制 native 层的 Surface 对象地址。

2.2 Session 到 WindowSurfaceController

Android SurfaceView设置第一针 android surface创建_android_02

        (1)relayout

        /frameworks/base/services/core/java/com/android/server/wm/Session.java

public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, 
		int viewFlags, int flags, long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, 
		Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Rect outBackdropFrame, DisplayCutout.ParcelableWrapper cutout, 
		MergedConfiguration mergedConfiguration, SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
	...
	int res = mService.relayoutWindow(this, window, seq, attrs, requestedWidth, requestedHeight, viewFlags, 
			flags, frameNumber, outFrame, outOverscanInsets, outContentInsets, outVisibleInsets, outStableInsets, 
			outsets, outBackdropFrame, cutout, mergedConfiguration, outSurfaceControl, outInsetsState);
	...
}

        (2)relayoutWindow

        /frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

public int relayoutWindow(Session session, IWindow client, int seq, LayoutParams attrs,
		int requestedWidth, int requestedHeight, int viewVisibility, int flags,
		long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
		Rect outVisibleInsets, Rect outStableInsets, Rect outOutsets, Rect outBackdropFrame,
		DisplayCutout.ParcelableWrapper outCutout, MergedConfiguration mergedConfiguration,
		SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
	...
	synchronized (mGlobalLock) {
		//mWindowMap.get(client.asBinder())
		final WindowState win = windowForClientLocked(session, client, false);
		...
        //mWinAnimator 在 WindowState 的构造方法中创建
		WindowStateAnimator winAnimator = win.mWinAnimator;
		if (viewVisibility != View.GONE) {
			win.setRequestedSize(requestedWidth, requestedHeight);
		}
		win.setFrameNumber(frameNumber);
		...
		if (shouldRelayout) {
			...
			try {
                //创建 SurfaceControl 对象,并拷贝给 outSurfaceControl
				result = createSurfaceControl(outSurfaceControl, result, win, winAnimator);
			}
			...
		}
		...
	}
	...
}

        说明:WindowStateAnimator 在 WindowState 的构造方法中创建,并将自身注入,即 WindowState 对象与 WindowStateAnimator 对象一一对应。

        (3)createSurfaceControl

        /frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

private int createSurfaceControl(SurfaceControl outSurfaceControl, int result, WindowState win, WindowStateAnimator winAnimator) {
	...
	WindowSurfaceController surfaceController;
	try {
		...
        //创建 WindowSurfaceController 
		surfaceController = winAnimator.createSurfaceLocked(win.mAttrs.type, win.mOwnerUid);
	}
	...
	if (surfaceController != null) {
        //获取 SurfaceController:outSurfaceControl.copyFrom(mSurfaceControl)
		surfaceController.getSurfaceControl(outSurfaceControl);
		...
	}
	...
}

        (4)createSurfaceLocked

        /frameworks/base/services/core/java/com/android/server/wm/WindowStateAnimator.java

WindowSurfaceController createSurfaceLocked(int windowType, int ownerUid) {
	final WindowState w = mWin;
	if (mSurfaceController != null) {
		return mSurfaceController;
	}
	...
	calculateSurfaceBounds(w, attrs, mTmpSize);
	...
	try {
		...
		mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession, attrs.getTitle().toString(), 
				width, height, format, flags, this, windowType, ownerUid);
		...
	}
	...
	return mSurfaceController;
}

         说明:WindowSurfaceController 在 WindowStateAnimator 中单例存在,在创建 WindowSurfaceController 时,又将 WindowStateAnimator 注入,由此说明 WindowSurfaceController 和  WindowStateAnimator 一一对应,进一步说明 WindowState 与 WindowSurfaceController 、WindowStateAnimator 一一对应。

        (5)WindowSurfaceController

        /frameworks/base/services/core/java/com/android/server/wm/WindowSurfaceController.java

public WindowSurfaceController(SurfaceSession s, String name, int w, int h, int format,
		int flags, WindowStateAnimator animator, int windowType, int ownerUid) {
	mAnimator = animator;
	mSurfaceW = w;
	mSurfaceH = h;
	title = name;
	mService = animator.mService;
	final WindowState win = animator.mWin;
	mWindowType = windowType;
	mWindowSession = win.mSession;
	...
	final SurfaceControl.Builder b = win.makeSurface().setParent(win.getSurfaceControl()).setName(name)
			.setBufferSize(w, h).setFormat(format).setFlags(flags).setMetadata(METADATA_OWNER_UID, ownerUid);
	//创建 SurfaceControl:new SurfaceControl()
	mSurfaceControl = b.build(); 
}

        说明: win.makeSurface() 调用的是 WindowState 的父类 WindowContainer 中的方法。

        (6)getSurfaceControl

        /frameworks/base/services/core/java/com/android/server/wm/WindowSurfaceController.java

void getSurfaceControl(SurfaceControl outSurfaceControl) {
	outSurfaceControl.copyFrom(mSurfaceControl);
}

2.3 WindowContainer 到 SurfaceControl

Android SurfaceView设置第一针 android surface创建_framework_03

        (1)makeSurface

        /frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java

SurfaceControl.Builder makeSurface() {
	final WindowContainer p = getParent();
	return p.makeChildSurface(this);
}

        说明:WindowSurfaceController 调用了 win.makeSurface(),而 WindowState 继承了 WindowContainer。

        (2)makeChildSurface

        /frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java

//child 为 WindowState 对象
SurfaceControl.Builder makeChildSurface(WindowContainer child) {
	final WindowContainer p = getParent();
	return p.makeChildSurface(child).setParent(mSurfaceControl);
}

        说明:这里顺着容器层次结构由下往上依次调用,直到某个容器重写了 makeChildSurface() 方法,先后经历的容器有 WindowState、WindowToken、Task、TaskStack、DisplayContent,这些容器中,只有 DisplayContent 重写 WindowContainer 的 makeChildSurface() 方法。

        (3)makeChildSurface

        /frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java

SurfaceControl.Builder makeChildSurface(WindowContainer child) {
    //child 为 WindowState 对象
	SurfaceSession s = child != null ? child.getSession() : getSession();
	final SurfaceControl.Builder b = mWmService.makeSurfaceBuilder(s).setContainerLayer();
	if (child == null) {
		return b;
	}
    //mWindowingLayer 属于 SurfaceControl 类,在 DisplayContent 的构造方法中创建
	return b.setName(child.getName()).setParent(mWindowingLayer);
}

        (4)getSession

        /frameworks/base/services/core/java/com/android/server/wm/WindowState.java

SurfaceSession getSession() {
	if (mSession.mSurfaceSession != null) {
		return mSession.mSurfaceSession;
	} else {
		return getParent().getSession();
	}
}

        说明:mSession.mSurfaceSession 在 WindowState 初始化时创建,具体流程为:在 WindowState 中调用 attach() 方法中,再调用 Session 的 windowAddedLocked() 方法,详见→View添加过程。

        (5)makeSurfaceBuilder

        /frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

//将 SurfaceBuilderFactory 的 make() 方法映射到 SurfaceControl.Builder 的有参构造方法
SurfaceBuilderFactory mSurfaceBuilderFactory = SurfaceControl.Builder::new;

SurfaceControl.Builder makeSurfaceBuilder(SurfaceSession s) {
	return mSurfaceBuilderFactory.make(s);
}

        (6)make

        /frameworks/base/services/core/java/com/android/server/wm/SurfaceBuilderFactory.java

interface SurfaceBuilderFactory {
    SurfaceControl.Builder make(SurfaceSession s);
};

         说明:将 SurfaceBuilderFactory 的 make() 方法映射到 SurfaceControl.Builder 的有参构造方法,SurfaceSession 对象来自 Session。

        (7)Build

        /frameworks/base/core/java/android/view/SurfaceControl.Build.java

public Builder(SurfaceSession session) {
	mSession = session;
}

        (8)SurfaceControl

        /frameworks/base/core/java/android/view/SurfaceControl.Build.java

public SurfaceControl build() {
	...
	return new SurfaceControl(mSession, mName, mWidth, mHeight, mFormat, mFlags, mParent, mMetadata);
}