> 文章列表 > android12 displayArea学习

android12 displayArea学习

android12 displayArea学习

一:数据结构分析

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 中。