一:数据结构分析
1:android 12 WindowContainer 的类继承关系如下
下图为 WindowContainer 简要的对象图。
下图是 Aosp默认的display层次结构对象图。
Aosp定义的feature有如下
FEATURE_ROOT = 0;
FEATURE_DEFAULT_TASK_CONTAINER = 1;
FEATURE_WINDOW_TOKENS = 2;
FEATURE_ONE_HANDED = 3;
FEATURE_WINDOWED_MAGNIFICATION = 4;
FEATURE_FULLSCREEN_MAGNIFICATION = 5;
FEATURE_HIDE_DISPLAY_CUTOUT = 6;
FEATURE_IME_PLACEHOLDER = 7;
FEATURE_ONE_HANDED_BACKGROUND_PANEL = 8;
默认的FEATURE ID取值范围为 0~10000;vendor部分则是从10001~20000;RUNTIME_TASK_CONTAINER则是从20001 ~ maxInt;
二:流程分析
一:displayArea层次结构初始化流程
每一个displayContent下,有三种不同的displayArea
1):对应具体feature的displayArea
2):叶节点DisplayArea
3):具体的widowToken和WindowState
对于这三种不同的displayArea,也分别有不同的创建时机
1:添加 Feature 规则
对应具体Feature的DisplayArea,先是在DisplayAreaPolicy.Provider 根据window type的feature规则创建对应的feature层次关系
2:基于 Feature 规则创建 pendingArea
第一步时,先创建root这一层的pendingArea
第二步,根据先前设置的feature数量,遍历所有Layer,根据具体规则创建每一层的pendingArea。
第三步,遍历所有layer,在后面添加一个用于叶节点的pendingArea。
3:从root节点遍历所有子节点创建 DisplayArea
设置root节点为DisplayContent,同时从root节点开始,遍历所有子节点,创建DisplayArea,同时也创建对应的DisplayArea的surface。
到这一步,DisplayArea的层次结构就创建完成了。在这个结构中,还没有具体的窗口和activity。
二:activity的创建流程
上图所示流程为冷启动activity的场景,在ATMS的视角下,会完成activityRecord和Task的创建,并把Task放到taskDisplayArea下面,把activityRecord放到Task下面。
上图为activity启动的第二部分,向WMS中addWindow。这一步中会从DisplayContent中查到前一步到创建的ActivityRecord,并以此为参数创建WindowState,再把新创建的WindowState放到ActivityRecord中。
第三部分则是activity向WMS发起relayout的请求。这一部分主要是surface相关的操作,这里不深入。
三:addView窗口创建流程
上图为单独addView添加窗口的流程。
第一步是先根据应用要求找到对应的 DisplayContent,再创建一个 WindowToken,根据window type找到初始化时创建的对应叶节点,把自己做为子节点挂上去。
再以前面的 WindowToken 为参数创建对应的 WindowState,再把新创建的WindowState放到WindowToken 中。