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如何挂在到窗口层级结构树的内容就全部结束。