Android 11 WindowContainer窗口模型详解
3:34 pm
Wednesday, 29 June 2022 (HKT)
Time in Hong Kong
概述
基于Android 11分析ConfigurationContainer
和WindowContainer
的模型。
类图
类 | 说明 |
---|---|
ConfigurationContainer | |
WindowContainer | |
WindowProcessController | 与AMS的ProcessRecord通信、与ActivityThread通信 |
RootWindowContainer | Tree root节点 |
DisplayContent | RootWindowContainer的子节点,用于管理同一个逻辑屏的窗口 |
DisplayChildWindowContainer | DisplayContent中的所有子节点的父类 |
NonAppWindowContainers | 继承于DisplayChildWindowContainer,保存非应用的WindowToken |
WindowContainers | 只包含一个子节点:DisplayArea.Root,大部分窗口都保存在这个容器 |
DisplayArea | 对DisplayContent内的节点进行分类管理 |
DisplayArea.Root extends DisplayArea | DisplayContent中最顶层的显示区域,用来保存 Tokens、TaskDisplayArea、ImeContainer容器 |
TaskDisplayArea extends DisplayArea | 用于管理Task |
DisplayArea.Tokens extends DisplayArea | 用于保存普通窗口的 WindowToken |
DisplayContent.ImeContainer extends Tokens | 用于保存IME窗口的 WindowToken |
Task | 保存ActivityRecord |
ActivityStack extends Task | 管理处于同一个栈的Activity,特殊栈可以保存Task |
WindowToken | 管理窗口,多个窗口可以被一个 WindowToken 进行管理 |
ActivityRecord extends WindowToken | 表示ActivityStack中的一个 Activity实例 |
WallpaperWindowToken extends WindowToken | 壁纸窗口 |
WindowState | 窗口对象 |
- Android 11 Window Tree模型:
- 下面是Android 12的窗口Tree层级模型,大致上与Android 11相差不大。其中Android 12完全移除了
ActivityStack
,仅使用Task
。在Android 11中ActivityStack
实际上是Task
的子类。
- Android 10 的Window Tree模型
Android 11就已经对Window Tree模型大改了,可以看到与Android 10差异很大。Android 11解决和改善了Android 10中各种独立混乱的*Record
,并将他们合并,取代了Android 10中窗口模型分散在AMS和WMS的情况,因此产生了架构和结构上的巨大差异。
- Android 11 WindowContainer总体架构:
- Android 11 WindowContainer类图:
总结
从Window Tree模型、类图、结构图可以看到,Android 11在Window相关部分的改动量很大,结构差异、流程变化不小。其相对Android 10可以说是完全不同的两种实现,而对Android 12则一脉相承、差异较小。可以这么认为,在Window这一块,Android 11与Android 12相对Android 10来说是全新的一套实现和机制。
Android 11和Android 12带来的全新实现,我想除了是为了实现全局缩放功能外(似乎Android引入DisplayArea
的目的是为了实现缩放功能,代码中已经可以看到大量的缩放机制支持代码),还能够解决Android 10中Window部分的实现存在的冗余——Window实现含有大量*Record
。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PeaceMaker!
评论
DisqusWaline