1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > android 13 WMS/AMS系统开发-窗口层级相关SurfaceFlinger图层创建 第三节

android 13 WMS/AMS系统开发-窗口层级相关SurfaceFlinger图层创建 第三节

时间:2024-04-29 13:58:09

相关推荐

android 13 WMS/AMS系统开发-窗口层级相关SurfaceFlinger图层创建 第三节

创建Surfacelinger的图层堆栈打印添加:

更多内容qqun:422901085 /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.*/@NonNullpublic 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 DefaultTaskDisplayAreaLine 9966: 02-20 21:53:01.238 558 558 I test1 : java.lang.ExceptionLine 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:14Line 10388: 02-20 21:53:01.245 558 558 I test1 : java.lang.ExceptionLine 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方法

@OverrideSurfaceControl.Builder makeChildSurface(WindowContainer child) {SurfaceSession s = child != null ? child.getSession() : getSession();final SurfaceControl.Builder b = mWmService.makeSurfaceBuilder(s).setContainerLayer();//注意这里都是容器typeif (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() {//ignoremSurfaceController = 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。