3:34 pm
Wednesday, 29 June 2022 (HKT)
Time in Hong Kong


概述

基于Android 11分析ConfigurationContainerWindowContainer的模型。

类图

说明
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模型:

Android11WindowTree模型

  • 下面是Android 12的窗口Tree层级模型,大致上与Android 11相差不大。其中Android 12完全移除了ActivityStack,仅使用Task。在Android 11中ActivityStack实际上是Task的子类。

Android12窗口模型抽象

Android11窗口模型结构

  • Android 10 的Window Tree模型

Android 11就已经对Window Tree模型大改了,可以看到与Android 10差异很大。Android 11解决和改善了Android 10中各种独立混乱的*Record,并将他们合并,取代了Android 10中窗口模型分散在AMS和WMS的情况,因此产生了架构和结构上的巨大差异。

Android 10窗口模型抽象

  • Android 11 WindowContainer总体架构:

Android11WindowContainer总体架构

  • 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