Android之WMS篇(三)窗口层级结构树挂载Child

RootWindowContainer中的setWindowManager方法执行完成整个窗口层级树只是大体结构完成,我们平时看到的Activity,StatusBar,NavigationBar及应用中执行WindoManager.addView方法过程的addWidow都还没有添加到窗口层级树中
setWindowManager方法执行完成后App端在运行过程中add的Window具体有以下几个:Task,ActivityRecord,WindowToken,WindowState等等

1.RootTask的创建及挂载
上篇介绍完了窗口层级树的构建,在窗口层级树构建完成后RootWindowContainer中的setWindowManager方法中会创建一个RootTask用于App启动的时候放置Activity和对应Task


    void setWindowManager(WindowManagerService wm) {
	    //省略代码 
        final TaskDisplayArea defaultTaskDisplayArea = getDefaultTaskDisplayArea();
        defaultTaskDisplayArea.getOrCreateRootHomeTask(ON_TOP);
        positionChildAt(POSITION_TOP, defaultTaskDisplayArea.mDisplayContent,
                false /* includingParents */);
    }

1.1.获取到窗口层级树中的defaultTaskDisplayArea
1.2.在defaultTaskDisplayArea中创建RootTask
那么这个RootTask具体是怎么创建的呢?我们需要借助于日志打印出RootTask创建时的调用栈。
RootTask它也只是一个Task,Task也是继承了WindowContainer的,因此Task的挂在最后也会走到WindowContainer中的addChild方法中。所以我们在WindowContainer的addChild方法中添加log.
addChild有两个重载的方法,两个方法中都需要添加Log

    protected void addChild(E child, Comparator<E> comparator) {
        if((child instanceof Task) || (child instanceof ActivityRecord) || (child instanceof WindowState)){
            android.util.Log.i("Gary",this + " addChild comparator child = " + child,new Exception());
        }
		//省略代码
        // Set the parent after we've actually added a child in case a subclass depends on this.
        child.setParent(this);
    }
    void addChild(E child, int index) {
        if((child instanceof Task) || (child instanceof ActivityRecord) || (child instanceof WindowState)){
            android.util.Log.i("Gary", this + "addChild index child = " + child,new Exception());
        }

		//省略代码
        mChildren.add(index, child);

        // Set the parent after we've actually added a child in case a subclass depends on this.
        child.setParent(this);
    }

添加了log开机之后打印logcat就可以看到对应的log

07-15 21:50:47.144   557   557 I Gary    : DefaultTaskDisplayArea@92865357addChild index child = Task{4e60e02 #1 type=home ?? U=0 visible=false visibleRequested=false mode=undefined translucent=true sz=0}
07-15 21:50:47.144   557   557 I Gary    : java.lang.Exception
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:728)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.addChildTask(TaskDisplayArea.java:334)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.addChild(TaskDisplayArea.java:320)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.Task$Builder.build(Task.java:6551)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.createRootTask(TaskDisplayArea.java:1066)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.createRootTask(TaskDisplayArea.java:1040)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.getOrCreateRootHomeTask(TaskDisplayArea.java:1640)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.setWindowManager(RootWindowContainer.java:1321)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.wm.ActivityTaskManagerService.setWindowManager(ActivityTaskManagerService.java:1006)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.am.ActivityManagerService.setWindowManager(ActivityManagerService.java:1923)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:1595)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.SystemServer.run(SystemServer.java:939)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.server.SystemServer.main(SystemServer.java:649)
07-15 21:50:47.144   557   557 I Gary    : 	at java.lang.reflect.Method.invoke(Native Method)
07-15 21:50:47.144   557   557 I Gary    : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)

RootTask是task1,type=home,mode=fullscreen与窗口层级树中是完全可以对应的上

 #1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
        #2 Task=1 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]

此时的窗口层级树如下图:
在这里插入图片描述在defaultTaskArea中添加了task=1的root task.

2.FallbackHome Activty相关的挂载
众所周知Android系统在启动的时候启动的第一个Activity是Setting中的FallbackHome.
2.1.root task下挂在子task

07-15 21:50:49.220   557   557 I Gary    : Task{4e60e02 #1 type=home ?? U=0 visible=true visibleRequested=false mode=fullscreen translucent=true sz=0} addChild comparator child = Task{be95a #2 type=undefined A=1000:com.android.settings.FallbackHome U=0 visible=false visibleRequested=false mode=undefined translucent=true sz=0}
07-15 21:50:49.220   557   557 I Gary    : java.lang.Exception
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:694)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.Task.addChild(Task.java:5935)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.Task.-$$Nest$maddChild(Unknown Source:0)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.Task$Builder.build(Task.java:6548)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.Task.reuseOrCreateTask(Task.java:5819)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.setNewTask(ActivityStarter.java:2872)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityInner(ActivityStarter.java:1864)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1661)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1216)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:702)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityStartController.startHomeActivity(ActivityStartController.java:179)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnTaskDisplayArea(RootWindowContainer.java:1493)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.lambda$startHomeOnDisplay$12$com-android-server-wm-RootWindowContainer(RootWindowContainer.java:1434)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda7.apply(Unknown Source:16)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.reduceOnAllTaskDisplayAreas(TaskDisplayArea.java:513)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.WindowContainer.reduceOnAllTaskDisplayAreas(WindowContainer.java:2285)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnDisplay(RootWindowContainer.java:1433)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnDisplay(RootWindowContainer.java:1420)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnAllDisplays(RootWindowContainer.java:1405)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.wm.ActivityTaskManagerService$LocalService.startHomeOnAllDisplays(ActivityTaskManagerService.java:5892)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:8203)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:2801)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.SystemServer.run(SystemServer.java:939)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.server.SystemServer.main(SystemServer.java:649)
07-15 21:50:49.220   557   557 I Gary    : 	at java.lang.reflect.Method.invoke(Native Method)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
07-15 21:50:49.220   557   557 I Gary    : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)

从调用栈的日志可以看出在Task=1的root task中add了一个Task=2的Task

07-15 21:50:49.220   557   557 I Gary    : Task{4e60e02 #1 type=home ?? U=0 visible=true visibleRequested=false mode=fullscreen translucent=true sz=0} addChild comparator child = Task{be95a #2 type=undefined A=1000:com.android.settings.FallbackHome U=0 visible=false visibleRequested=false mode=undefined translucent=true sz=0}

2.2.task=2的task中挂在ActivityRecord

07-15 21:50:49.221   557   557 I Gary    : Task{be95a #2 type=undefined A=1000:com.android.settings.FallbackHome U=0 rootTaskId=1 visible=true visibleRequested=false mode=fullscreen translucent=true sz=0}addChild index child = ActivityRecord{212f068 u0 com.android.settings/.FallbackHome}
07-15 21:50:49.221   557   557 I Gary    : java.lang.Exception
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:728)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.TaskFragment.addChild(TaskFragment.java:1835)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.Task.addChild(Task.java:1429)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.addOrReparentStartingActivity(ActivityStarter.java:2927)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.setNewTask(ActivityStarter.java:2877)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityInner(ActivityStarter.java:1864)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1661)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1216)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:702)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityStartController.startHomeActivity(ActivityStartController.java:179)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnTaskDisplayArea(RootWindowContainer.java:1493)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.lambda$startHomeOnDisplay$12$com-android-server-wm-RootWindowContainer(RootWindowContainer.java:1434)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda7.apply(Unknown Source:16)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.TaskDisplayArea.reduceOnAllTaskDisplayAreas(TaskDisplayArea.java:513)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.DisplayArea.reduceOnAllTaskDisplayAreas(DisplayArea.java:404)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.WindowContainer.reduceOnAllTaskDisplayAreas(WindowContainer.java:2285)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnDisplay(RootWindowContainer.java:1433)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnDisplay(RootWindowContainer.java:1420)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnAllDisplays(RootWindowContainer.java:1405)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.wm.ActivityTaskManagerService$LocalService.startHomeOnAllDisplays(ActivityTaskManagerService.java:5892)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:8203)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:2801)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.SystemServer.run(SystemServer.java:939)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.server.SystemServer.main(SystemServer.java:649)
07-15 21:50:49.221   557   557 I Gary    : 	at java.lang.reflect.Method.invoke(Native Method)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
07-15 21:50:49.221   557   557 I Gary    : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)

从调用栈的日志中可以看出在task=2的task中添加了FallbackHome的ActivityRecord

07-15 21:50:49.221   557   557 I Gary    : Task{be95a #2 type=undefined A=1000:com.android.settings.FallbackHome U=0 rootTaskId=1 visible=true visibleRequested=false mode=fullscreen translucent=true sz=0}addChild index child = ActivityRecord{212f068 u0 com.android.settings/.FallbackHome}

2.3.FallBackHome的ActivityRecord下添加FallbackHome的WindowState

07-15 21:50:49.608   557   914 I Gary    : DefaultTaskDisplayArea@92865357addChild index child = Task{7d3619f #6 type=undefined ?? U=0 visible=false visibleRequested=false mode=undefined translucent=true sz=0}
07-15 21:50:49.608   557   914 I Gary    : java.lang.Exception
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:728)
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.TaskDisplayArea.addChildTask(TaskDisplayArea.java:334)
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.TaskDisplayArea.addChild(TaskDisplayArea.java:320)
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.Task$Builder.build(Task.java:6551)
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.TaskOrganizerController.createRootTask(TaskOrganizerController.java:662)
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.TaskOrganizerController.createRootTask(TaskOrganizerController.java:641)
07-15 21:50:49.608   557   914 I Gary    : 	at android.window.ITaskOrganizerController$Stub.onTransact(ITaskOrganizerController.java:211)
07-15 21:50:49.608   557   914 I Gary    : 	at com.android.server.wm.TaskOrganizerController.onTransact(TaskOrganizerController.java:342)
07-15 21:50:49.608   557   914 I Gary    : 	at android.os.Binder.execTransactInternal(Binder.java:1280)
07-15 21:50:49.608   557   914 I Gary    : 	at android.os.Binder.execTransact(Binder.java:1244)

到这里Andorid系统启动过程的第一个Activity FallbackHome相应的Task,ActivityRecord,WindowState都挂在到了窗口层级树上。由于这是开机过程的中间过程,这里通过"adb shell dumpsys activity containers"的命令dump对应的日志。系统完全起来之后我们看到的home界面。下边就来看看home界面时的挂在过程。

3.QuickstepLauncher Activity的挂在
3.1.root task下挂在QuickstepLauncher 对应的task

07-15 21:50:47.923   557   659 I Gary    : Task{4e60e02 #1 type=home ?? U=0 visible=true visibleRequested=false mode=fullscreen translucent=true sz=1} addChild comparator child = Task{c53319a #18 type=undefined I=com.android.launcher3/.uioverrides.QuickstepLauncher U=0 visible=false visibleRequested=false mode=undefined translucent=true sz=0}
07-15 21:50:47.923   557   659 I Gary    : java.lang.Exception
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:694)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.addChild(Task.java:5935)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.-$$Nest$maddChild(Unknown Source:0)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task$Builder.build(Task.java:6548)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.reuseOrCreateTask(Task.java:5819)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.setNewTask(ActivityStarter.java:2872)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityInner(ActivityStarter.java:1864)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1661)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1216)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:702)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityStartController.startHomeActivity(ActivityStartController.java:179)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnTaskDisplayArea(RootWindowContainer.java:1493)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeHomeActivity(RootWindowContainer.java:1627)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.resumeNextFocusableActivityWhenRootTaskIsEmpty(Task.java:5043)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:4998)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:4938)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:4952)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:4984)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2299)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2246)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2241)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityRecord.addToFinishingAndWaitForIdle(ActivityRecord.java:3668)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityRecord.completeFinishing(ActivityRecord.java:3588)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1696)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:5988)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:178)
07-15 21:50:47.923   557   659 I Gary    : 	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:574)
07-15 21:50:47.923   557   659 I Gary    : 	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:124)
07-15 21:50:47.923   557   659 I Gary    : 	at android.os.Binder.execTransactInternal(Binder.java:1280)
07-15 21:50:47.923   557   659 I Gary    : 	at android.os.Binder.execTransact(Binder.java:1244)

从调用栈的日志可以看出在Task=1的root task中add了一个Task=18的Task

07-15 21:50:47.923   557   659 I Gary    : Task{4e60e02 #1 type=home ?? U=0 visible=true visibleRequested=false mode=fullscreen translucent=true sz=1} addChild comparator child = Task{c53319a #18 type=undefined I=com.android.launcher3/.uioverrides.QuickstepLauncher U=0 visible=false visibleRequested=false mode=undefined translucent=true sz=0}

3.2.QuickstepLauncher 的task下挂在QuickstepLauncher 的ActivityRecord

07-15 21:50:47.925   557   659 I Gary    : Task{c53319a #18 type=undefined I=com.android.launcher3/.uioverrides.QuickstepLauncher U=0 rootTaskId=1 visible=true visibleRequested=false mode=fullscreen translucent=true sz=0}addChild index child = ActivityRecord{54612a8 u0 com.android.launcher3/.uioverrides.QuickstepLauncher}
07-15 21:50:47.925   557   659 I Gary    : java.lang.Exception
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:728)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.TaskFragment.addChild(TaskFragment.java:1835)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.Task.addChild(Task.java:1429)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.addOrReparentStartingActivity(ActivityStarter.java:2927)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.setNewTask(ActivityStarter.java:2877)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityInner(ActivityStarter.java:1864)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1661)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1216)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:702)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityStartController.startHomeActivity(ActivityStartController.java:179)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.startHomeOnTaskDisplayArea(RootWindowContainer.java:1493)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeHomeActivity(RootWindowContainer.java:1627)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.Task.resumeNextFocusableActivityWhenRootTaskIsEmpty(Task.java:5043)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:4998)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:4938)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:4952)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:4984)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2299)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2246)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2241)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityRecord.addToFinishingAndWaitForIdle(ActivityRecord.java:3668)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityRecord.completeFinishing(ActivityRecord.java:3588)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1696)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:5988)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:178)
07-15 21:50:47.925   557   659 I Gary    : 	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:574)
07-15 21:50:47.925   557   659 I Gary    : 	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:124)
07-15 21:50:47.925   557   659 I Gary    : 	at android.os.Binder.execTransactInternal(Binder.java:1280)
07-15 21:50:47.925   557   659 I Gary    : 	at android.os.Binder.execTransact(Binder.java:1244)

从调用栈的日志中可以看出在task=18的task中添加了QuickstepLauncher 的ActivityRecord

07-15 21:50:47.925   557   659 I Gary    : Task{c53319a #18 type=undefined I=com.android.launcher3/.uioverrides.QuickstepLauncher U=0 rootTaskId=1 visible=true visibleRequested=false mode=fullscreen translucent=true sz=0}addChild index child = ActivityRecord{54612a8 u0 com.android.launcher3/.uioverrides.QuickstepLauncher}

3.3.QuickstepLauncher 的ActivityRecord下添加QuickstepLauncher 的WindowState

07-15 21:50:49.929   557   914 I Gary    : ActivityRecord{54612a8 u0 com.android.launcher3/.uioverrides.QuickstepLauncher} t18} addChild comparator child = Window{dbbe0b6 u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}
07-15 21:50:49.929   557   914 I Gary    : java.lang.Exception
07-15 21:50:49.929   557   914 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:694)
07-15 21:50:49.929   557   914 I Gary    : 	at com.android.server.wm.WindowToken.addWindow(WindowToken.java:302)
07-15 21:50:49.929   557   914 I Gary    : 	at com.android.server.wm.ActivityRecord.addWindow(ActivityRecord.java:4212)
07-15 21:50:49.929   557   914 I Gary    : 	at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1773)
07-15 21:50:49.929   557   914 I Gary    : 	at com.android.server.wm.Session.addToDisplayAsUser(Session.java:209)
07-15 21:50:49.929   557   914 I Gary    : 	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:652)
07-15 21:50:49.929   557   914 I Gary    : 	at com.android.server.wm.Session.onTransact(Session.java:175)
07-15 21:50:49.929   557   914 I Gary    : 	at android.os.Binder.execTransactInternal(Binder.java:1280)
07-15 21:50:49.929   557   914 I Gary    : 	at android.os.Binder.execTransact(Binder.java:1244)

到这里整个QuickstepLauncher Activity相关的Task,ActivityRecord,WindowState都挂在到窗口层级树,此时的窗口层级树结构如下图
在这里插入图片描述
4.StatusBar,NavigationBar还有WindowManager.addView方法添加窗口挂在到窗口层级树的过程基本一致。我们就以TopBar为例展示以下

4.1.StatusBar的WindowToken挂在

07-16 22:35:08.684   557   615 I Gary    : Leaf:15:15@215493953 addChild comparator child = WindowToken{832068e type=2000 android.os.BinderProxy@851cd90}
07-16 22:35:08.684   557   615 I Gary    : java.lang.Exception
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:694)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.DisplayArea$Tokens.addChild(DisplayArea.java:605)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.DisplayContent.addWindowToken(DisplayContent.java:1235)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowToken.<init>(WindowToken.java:214)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowToken$Builder.build(WindowToken.java:817)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1577)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.Session.addToDisplayAsUser(Session.java:209)
07-16 22:35:08.684   557   615 I Gary    : 	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:652)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.Session.onTransact(Session.java:175)
07-16 22:35:08.684   557   615 I Gary    : 	at android.os.Binder.execTransactInternal(Binder.java:1285)
07-16 22:35:08.684   557   615 I Gary    : 	at android.os.Binder.execTransact(Binder.java:1244)

Leaf:15:15下挂在了一个WindowToken,这个windowToken用来挂在StatusBar的WindowState

07-16 22:35:08.684   557   615 I Gary    : Leaf:15:15@215493953 addChild comparator child = WindowToken{832068e type=2000 android.os.BinderProxy@851cd90}

4.2.StatusBar的WindowToken下挂在StatusBar的WindowState

07-16 22:35:08.684   557   615 I Gary    : WindowToken{832068e type=2000 android.os.BinderProxy@851cd90} addChild comparator child = Window{a2e32bc u0 StatusBar}
07-16 22:35:08.684   557   615 I Gary    : java.lang.Exception
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowContainer.addChild(WindowContainer.java:694)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowToken.addWindow(WindowToken.java:302)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1773)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.Session.addToDisplayAsUser(Session.java:209)
07-16 22:35:08.684   557   615 I Gary    : 	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:652)
07-16 22:35:08.684   557   615 I Gary    : 	at com.android.server.wm.Session.onTransact(Session.java:175)
07-16 22:35:08.684   557   615 I Gary    : 	at android.os.Binder.execTransactInternal(Binder.java:1285)
07-16 22:35:08.684   557   615 I Gary    : 	at android.os.Binder.execTransact(Binder.java:1244)

从调用栈中可以看到StatusBar的WindowState挂在到了对应的WindowToken

07-16 22:35:08.684   557   615 I Gary    : WindowToken{832068e type=2000 android.os.BinderProxy@851cd90} addChild comparator child = Window{a2e32bc u0 StatusBar}

StatusBar挂在完成后的层级结构树如下图所示
加粗样式

StatusBar,NavigationBar还有WindowManager.addView方法添加窗口挂在到窗口层级树的过程基本一致。App端在ViewRootImpl中通过Session调用addToDisplayAsUser跨进程到WMS。WMS会先判断要添加的Window有没有WinowToken,
没有WinowToken就会new 一个WindowToken,然后new 一个WindowState,把WindowState挂在到WindoToken中。
具体的WindowToken该挂在到那一层级是根据add view时设置WindowManager.LayoutParams中的type来决定的。

到这篇博客结束,窗口层级结构树的构建和Window如何挂在到窗口层级结构树的内容就全部结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值