创建Surfacelinger的图层堆栈打印添加:
更多内容qqun:422901085 https://ke.qq.com/course/5992266#term_id=106217431
代码位置:
frameworks/base/core/java/android/view/SurfaceControl.java
/**
* Set a debugging-name for the SurfaceControl.
*
* @param name A name to identify the Surface in debugging.
*/
@NonNull
public Builder setName(@NonNull String name) {
mName = name;
if (name != null && name.contains("DefaultTaskDisplayArea") || name.contains("ImePlaceholder") ) {
android.util.Log.i("test1",this + "setName " + name,new Exception() );
}
return this;
}
这里之对DefaultTaskDisplayArea,ImePlaceholder进行特殊过滤以防打印太多
Line 9965: 02-20 21:53:01.238 558 558 I test1 : android.view.SurfaceControl$Builder@c7e3d28setName DefaultTaskDisplayArea
Line 9966: 02-20 21:53:01.238 558 558 I test1 : java.lang.Exception
Line 9967: 02-20 21:53:01.238 558 558 I test1 : at android.view.SurfaceControl$Builder.setName(SurfaceControl.java:1249)
Line 9968: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayContent.makeChildSurface(DisplayContent.java:5036)
Line 9969: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 9970: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 9971: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 9972: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 9973: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.makeSurface(WindowContainer.java:2408)
Line 9974: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.createSurfaceControl(WindowContainer.java:613)
Line 9975: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.onParentChanged(WindowContainer.java:594)
Line 9976: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.TaskDisplayArea.onParentChanged(TaskDisplayArea.java:818)
Line 9977: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.setParent(WindowContainer.java:571)
Line 9978: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:745)
Line 9979: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:922)
Line 9980: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 9981: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 9982: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 9983: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 9984: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.build(DisplayAreaPolicyBuilder.java:588)
Line 9985: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.-$$Nest$mbuild(Unknown Source:0)
Line 9986: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder.build(DisplayAreaPolicyBuilder.java:333)
Line 9987: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicy$DefaultProvider.instantiate(DisplayAreaPolicy.java:117)
Line 9988: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayContent.configureSurfaces(DisplayContent.java:1143)
Line 9989: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.DisplayContent.<init>(DisplayContent.java:1093)
Line 9990: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.RootWindowContainer.setWindowManager(RootWindowContainer.java:1313)
Line 9991: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.wm.ActivityTaskManagerService.setWindowManager(ActivityTaskManagerService.java:1006)
Line 9992: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.am.ActivityManagerService.setWindowManager(ActivityManagerService.java:1923)
Line 9993: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.SystemServer.startOtherServices(SystemServer.java:1595)
Line 9994: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.SystemServer.run(SystemServer.java:939)
Line 9995: 02-20 21:53:01.238 558 558 I test1 : at com.android.server.SystemServer.main(SystemServer.java:649)
Line 9996: 02-20 21:53:01.238 558 558 I test1 : at java.lang.reflect.Method.invoke(Native Method)
Line 9997: 02-20 21:53:01.238 558 558 I test1 : at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
Line 9998: 02-20 21:53:01.238 558 558 I test1 : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
Line 10387: 02-20 21:53:01.245 558 558 I test1 : android.view.SurfaceControl$Builder@ef25bcasetName ImePlaceholder:13:14
Line 10388: 02-20 21:53:01.245 558 558 I test1 : java.lang.Exception
Line 10389: 02-20 21:53:01.245 558 558 I test1 : at android.view.SurfaceControl$Builder.setName(SurfaceControl.java:1249)
Line 10390: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayContent.makeChildSurface(DisplayContent.java:5036)
Line 10391: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 10392: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 10393: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.makeChildSurface(WindowContainer.java:2419)
Line 10394: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.makeSurface(WindowContainer.java:2408)
Line 10395: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.createSurfaceControl(WindowContainer.java:613)
Line 10396: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.onParentChanged(WindowContainer.java:594)
Line 10397: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.onParentChanged(WindowContainer.java:581)
Line 10398: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.setParent(WindowContainer.java:571)
Line 10399: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:745)
Line 10400: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:922)
Line 10401: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 10402: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 10403: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$PendingArea.instantiateChildren(DisplayAreaPolicyBuilder.java:926)
Line 10404: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.build(DisplayAreaPolicyBuilder.java:588)
Line 10405: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder$HierarchyBuilder.-$$Nest$mbuild(Unknown Source:0)
Line 10406: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicyBuilder.build(DisplayAreaPolicyBuilder.java:333)
Line 10407: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayAreaPolicy$DefaultProvider.instantiate(DisplayAreaPolicy.java:117)
Line 10408: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayContent.configureSurfaces(DisplayContent.java:1143)
Line 10409: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.DisplayContent.<init>(DisplayContent.java:1093)
Line 10410: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.RootWindowContainer.setWindowManager(RootWindowContainer.java:1313)
Line 10411: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.wm.ActivityTaskManagerService.setWindowManager(ActivityTaskManagerService.java:1006)
Line 10412: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.am.ActivityManagerService.setWindowManager(ActivityManagerService.java:1923)
Line 10413: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.SystemServer.startOtherServices(SystemServer.java:1595)
Line 10414: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.SystemServer.run(SystemServer.java:939)
Line 10415: 02-20 21:53:01.245 558 558 I test1 : at com.android.server.SystemServer.main(SystemServer.java:649)
Line 10416: 02-20 21:53:01.245 558 558 I test1 : at java.lang.reflect.Method.invoke(Native Method)
Line 10417: 02-20 21:53:01.245 558 558 I test1 : at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
Line 10418: 02-20 21:53:01.245 558 558 I test1 : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
可以看出最后都会到达最顶层DisplayContent的makeChildSurface方法
@Override
SurfaceControl.Builder makeChildSurface(WindowContainer child) {
SurfaceSession s = child != null ? child.getSession() : getSession();
final SurfaceControl.Builder b = mWmService.makeSurfaceBuilder(s).setContainerLayer();//注意这里都是容器type
if (child == null) {
return b;
}
// if (child.getName()!= null && child.getName().contains("DefaultTask")) {
android.util.Log.i("test1","mSurfaceControl = " +mSurfaceControl + " child.getName() " + child.getName());
// }
return b.setName(child.getName())
.setParent(mSurfaceControl);//返回一个Builder,但是这注意哈,它是会setParent,但是不要紧每个层级WindowContainer中会重新设置Parent
}
那么对于我们层级结构可以得出以下结论
每addChild时候其实都会触发WindowContainer.onParentChanged,从而触发DisplayContent中创建对应的SurfaceControl,而且大家注意mWmService.makeSurfaceBuilder(s).setContainerLayer();创建出来的都是容器,而不是真正可以绘制的SurfaceControl
那么这里同学肯定有疑问?
请问那到底哪里才是真正的绘制画面的SurfaceControl呢?
这里其实我们前期知道app调用到wms的relayout才可以获取可以绘制画面的surfacecontrol,而且是wms端创建好传递回去的代码如下:
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public int relayoutWindow(Session session, IWindow client, LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewVisibility, int flags,
ClientWindowFrames outFrames, MergedConfiguration mergedConfiguration,
SurfaceControl outSurfaceControl, InsetsState outInsetsState,
InsetsSourceControl[] outActiveControls, Bundle outSyncIdBundle) {
可以看到outSurfaceControl参数,这个就是wms端写入数据,然后app端的ViewRootImpl来进行读取的。
那么看看它是在方法中哪里被使用的:
// Create surfaceControl before surface placement otherwise layout will be skipped
// (because WS.isGoneForLayout() is true when there is no surface.
if (shouldRelayout) {
try {
result = createSurfaceControl(outSurfaceControl, result, win, winAnimator);
} catch (Exception e) {
displayContent.getInputMonitor().updateInputWindowsLw(true /*force*/);
ProtoLog.w(WM_ERROR,
"Exception thrown when creating surface for client %s (%s). %s",
client, win.mAttrs.getTitle(), e);
Binder.restoreCallingIdentity(origId);
return 0;
}
}
调用是createSurfaceControl:
private int createSurfaceControl(SurfaceControl outSurfaceControl, int result,
WindowState win, WindowStateAnimator winAnimator) {
if (!win.mHasSurface) {
result |= RELAYOUT_RES_SURFACE_CHANGED;
}
WindowSurfaceController surfaceController;
try {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "createSurfaceControl");
surfaceController = winAnimator.createSurfaceLocked();
} finally {
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
if (surfaceController != null) {
surfaceController.getSurfaceControl(outSurfaceControl);
ProtoLog.i(WM_SHOW_TRANSACTIONS, "OUT SURFACE %s: copied", outSurfaceControl);
} else {
// For some reason there isn't a surface. Clear the
// caller's object so they see the same state.
ProtoLog.w(WM_ERROR, "Failed to create surface control for %s", win);
outSurfaceControl.release();
}
return result;
}
这里首先又调用到了winAnimator.createSurfaceLocked();
WindowSurfaceController createSurfaceLocked() {
//ignore
mSurfaceController = new WindowSurfaceController(attrs.getTitle().toString(), format,
flags, this, attrs.type);
//ignore
}
调用到了WindowSurfaceController构造:
WindowSurfaceController(String name, int format, int flags, WindowStateAnimator animator,
int windowType) {
mAnimator = animator;
title = name;
mService = animator.mService;
final WindowState win = animator.mWin;
mWindowType = windowType;
mWindowSession = win.mSession;
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "new SurfaceControl");
final SurfaceControl.Builder b = win.makeSurface()
.setParent(win.getSurfaceControl())
.setName(name)
.setFormat(format)
.setFlags(flags)
.setMetadata(METADATA_WINDOW_TYPE, windowType)
.setMetadata(METADATA_OWNER_UID, mWindowSession.mUid)
.setMetadata(METADATA_OWNER_PID, mWindowSession.mPid)
.setCallsite("WindowSurfaceController");//此时其实还是属于Container,因为DisplayerContent创建
final boolean useBLAST = mService.mUseBLAST && ((win.getAttrs().privateFlags
& WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0);
if (useBLAST) {
b.setBLASTLayer();//非常关键,变成非Container
}
mSurfaceControl = b.build();
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
哈哈,是不是终于看到对应的代码了图层Buffer图层type而不是Container的type