【Android 13源码分析】WMS-添加窗口(addWindow)流程-2-SystemService进程处理
内容提要
本文是Android 13源码分析中WMS-添加窗口流程的第二部分,介绍了SystemService进程处理剩下的逻辑,包括SystemServer进程处理、WindowManagerService::addWindow方法概览、Token相关、WindowState的创建和挂载等。文章还解答了之前提出的疑问。
延伸解读
Token 的传递与作用
文章详细分析了 WindowToken 在 addWindow 流程中的关键作用。Token 最初由 AMS 在创建 ActivityRecord 时生成,通过 Activity::attach 和 Window::setWindowManager 传递给应用进程的 Window 对象,最终在 adjustLayoutParamsForSubWindow 中设置到 LayoutParams.token。WMS 通过这个 Token 找到对应的 WindowToken,从而确定 WindowState 的挂载父节点。
WindowState 的创建与挂载
WindowState 是 WMS 中代表窗口的核心对象,它持有应用进程传递的 client(ViewRootImpl 中的 W)和从 LayoutParams 解析出的 Token。创建后,WindowState 通过 attach() 初始化,并存入 mWindowMap 以 client 的 Binder 为键,防止重复添加。随后调用 WindowToken::addWindow 将 WindowState 挂载到窗口树中,最终由 WindowContainer::addChild 完成层级插入,并依据 mB
addWindow 流程的命名由来
文章解答了为何应用进程调用 addView 而 WMS 却称为 addWindow 的疑问。在应用进程,ViewRootImpl::setView 通过跨进程调用传递一个 IWindow 对象(即 W)到 SystemServer 进程,WMS 并不直接操作应用端的 Window 或 View,而是基于这个 client 和 Token 创建 WindowState。WindowState 作为 WMS 中窗口的代理,负责与应用进程通信,因此整个流程在系统服务端被称为 addWindow。
Q&A
SystemServer进程在addWindow流程中负责什么?
SystemServer进程负责处理窗口的创建和挂载,主要通过WindowManagerService::addWindow方法实现。
addWindow方法中有哪些关键步骤?
addWindow方法的关键步骤包括权限检查、Token处理、WindowState创建和挂载等。
什么是WindowToken,它在addWindow流程中有什么作用?
WindowToken是窗口的父节点,确保窗口的层级关系,在addWindow流程中用于获取和管理窗口的层级结构。
WindowState是如何创建和挂载的?
WindowState的创建和挂载是在addWindow方法中进行的,通过创建WindowState对象并将其添加到窗口树中。
addWindow方法中如何处理权限验证?
addWindow方法通过调用mPolicy.checkAddPermission进行权限检查,确保窗口添加的合法性。
addWindow流程中如何处理窗口焦点?
addWindow流程中通过updateFocusedWindowLocked方法处理窗口焦点切换,确保用户输入正确传递给当前窗口。