卷III 第6章 深入理解控件系统
卷III 第6章 深入理解控件系统:连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口,以android-4.2.2_r1源码、全节点机制图和故障恢复证据完成验收。
学习目标
- 能在android-4.2.2_r1单一历史标签内解释连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口,不跨卷拼接文件与接口身份。
- 能操作全节点机制图,让本页 34 个坐标都具备出现、解释、实验和练习四级证据。
- 能使用章专属诊断切片保存入口、PID/TID、对象或状态、正常结果、错误返回与资源释放。
- 能主动制造“只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环”,再凭窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow定位、恢复、复位并以同输入重放。
从一个可失败的问题开始
卷III 第6章 深入理解控件系统不是类名清单,而是在android-4.2.2_r1中回答:连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口。先预测请求经过的线程、进程与对象所有者,再运行正常样本;如果窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow不能指出首个变化,本页结论仍不可交接。
本章不变量是在android-4.2.2_r1固定输入下,连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口的入口身份、状态拥有者、成功结果、错误返回和资源释放均可重复观察。将“只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环”作为反例,必须在同一版本、同一输入下看到确定的错误或状态分叉,并能恢复到基线。
来源范围、历史标签与当前迁移
卷III 第6章 深入理解控件系统以卷III图书馆书目和零售书目交叉核对Android 4.2.2目录;未取得原书正文,不作忠实性宣称。
AOSP版本与构建号表用于核对2.2/API 8、4.0.1/API 14、4.2.2/API 17及正式源码标签;android-4.2.2_r1源码树提供本页历史机制的一手坐标。当前Android架构文档只用于迁移对照,ART、Treble、稳定AIDL、模块化系统服务和现代构建工具不得倒填为三卷历史实现。
六个机制检查点
↡初始输入在本页用于锁定android-4.2.2_r1的事实坐标与允许输入。、↡调用入口在本页用于标出连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口由谁创建、修改与释放状态。、↡状态迁移在本页用于保存能复现正常路径的对象身份和时序。、↡可见反馈在本页用于暴露只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环发生的第一个边界。、↡故障注入在本页用于声明故障后重新接收请求所需的恢复条件。、↡复位重放在本页用于让独立读者凭窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow得到同一结论。。这六项把连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口落到窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow,防止目录词出现却没有运行解释。
先预测,再操作三个专属实验
围绕卷III 第6章 深入理解控件系统,先预测哪一个对象最先改变、“只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环”应在哪个边界暴露,以及恢复后窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow中的哪份证据必须回到原值;然后按全节点、版本因果、故障恢复的顺序操作。
1. 全节点机制与可执行探针
从卷III 第6章 深入理解控件系统的 34 个正式坐标中选择任一节点与处理阶段,比较章专属机制说明和探针;列表完整保留,不截断节点。
正式节点 → 运行机制 → 可执行探针
卷III 第6章 深入理解控件系统
选择目录节点和处理阶段,检查它怎样进入“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”的真实因果链。
正式目录坐标
34 个节点
第6章 深入理解控件系统
第6章 深入理解控件系统在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
当前动作
固定输入与所有者
使用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow检查第6章 深入理解控件系统的输入、状态变化、错误出口和释放结果
历史坐标
android-4.2.2_r1
platform/frameworks/base @ android-4.2.2_r1
正式目录逐项深读
下面保留 34 个正式目录坐标,但不重复套用实验流程。每个条目只回答它在连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口中的独立责任;共同的定位、单变量注错、恢复和重放动作统一由上方实验与下方练习验收。
第6章 深入理解控件系统
第6章 深入理解控件系统在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
6.1 初识Android的控件系统
6.1 初识Android的控件系统在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任是界定分析分母和结论边界。先列出它包含的入口、对象和退出条件,再用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow排除只凭类名或流程图得出的结论。
6.1.1 另一种创建窗口的方法
6.1.1 另一种创建窗口的方法在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.1.2 控件系统的组成
6.1.2 控件系统的组成在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
6.2 深入理解WindowManager
6.2 深入理解WindowManager在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.2.1 WindowManager的创建与体系结构
6.2.1 WindowManager的创建与体系结构在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.2.2 通过WindowManagerGlobal添加窗口
6.2.2 通过WindowManagerGlobal添加窗口在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.2.3 更新窗口的布局
6.2.3 更新窗口的布局在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.2.4 删除窗口
6.2.4 删除窗口在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.2.5 WindowManager的总结
6.2.5 WindowManager的总结在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任是界定分析分母和结论边界。先列出它包含的入口、对象和退出条件,再用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow排除只凭类名或流程图得出的结论。
6.3 深入理解ViewRootImpl
6.3 深入理解ViewRootImpl在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
6.3.1 ViewRootImpl的创建及其重要成员
6.3.1 ViewRootImpl的创建及其重要成员在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
6.3.2 控件系统的心跳:performTraversals()
6.3.2 控件系统的心跳:performTraversals()在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
6.3.3 ViewRootImpl总结
6.3.3 ViewRootImpl总结在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任是界定分析分母和结论边界。先列出它包含的入口、对象和退出条件,再用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow排除只凭类名或流程图得出的结论。
6.4 深入理解控件树的绘制
6.4 深入理解控件树的绘制在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.1 理解Canvas
6.4.1 理解Canvas在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.2 View.invalidate()与脏区域
6.4.2 View.invalidate()与脏区域在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任必须放回窗口会话、遍历调度和渲染后端。以同一View树对比测量、布局、绘制和输入消费,检查脏区、DisplayList与焦点变化是否形成闭环。
6.4.3 开始绘制
6.4.3 开始绘制在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.4 软件绘制的原理
6.4.4 软件绘制的原理在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.5 硬件加速绘制的原理
6.4.5 硬件加速绘制的原理在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.6 使用绘图缓存
6.4.6 使用绘图缓存在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.7 控件动画
6.4.7 控件动画在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.4.8 绘制控件树的总结
6.4.8 绘制控件树的总结在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任是界定分析分母和结论边界。先列出它包含的入口、对象和退出条件,再用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow排除只凭类名或流程图得出的结论。
6.5 深入理解输入事件的派发
6.5 深入理解输入事件的派发在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.5.1 触摸模式
6.5.1 触摸模式在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任从设备事件进入读取、策略、派发与完成反馈。给同一输入事件绑定序号,核对焦点窗口、通道、finish信号和ANR计时,丢失反馈即不能宣称处理完成。
6.5.2 控件焦点
6.5.2 控件焦点在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任要区分控制策略与音频数据平面。保存流、设备、缓冲区指针、处理线程和回调结果,注入欠载或路由变化后检查声音之外的状态恢复。
6.5.3 输入事件派发的综述
6.5.3 输入事件派发的综述在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.5.4 按键事件的派发
6.5.4 按键事件的派发在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任从设备事件进入读取、策略、派发与完成反馈。给同一输入事件绑定序号,核对焦点窗口、通道、finish信号和ANR计时,丢失反馈即不能宣称处理完成。
6.5.5 触摸事件的派发
6.5.5 触摸事件的派发在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任从设备事件进入读取、策略、派发与完成反馈。给同一输入事件绑定序号,核对焦点窗口、通道、finish信号和ANR计时,丢失反馈即不能宣称处理完成。
6.5.6 输入事件派发的总结
6.5.6 输入事件派发的总结在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任是界定分析分母和结论边界。先列出它包含的入口、对象和退出条件,再用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow排除只凭类名或流程图得出的结论。
6.6 Activity与控件系统
6.6 Activity与控件系统在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任要连接system_server记录、调度队列和目标进程回调。保存记录对象与进程身份,制造超时或死亡后检查队列推进、死亡清理和后续请求是否恢复。
6.6.1 理解PhoneWindow
6.6.1 理解PhoneWindow在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.6.2 Activity窗口的创建与显示
6.6.2 Activity窗口的创建与显示在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任横跨窗口身份、缓冲区所有权与合成时序。以同一帧记录生产、提交、层级、消费和移除,改变Z序或所有者后检查旧Surface是否仍可见或占用资源。
6.7 本章小结
6.7 本章小结在“连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口”中的责任是界定分析分母和结论边界。先列出它包含的入口、对象和退出条件,再用窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow排除只凭类名或流程图得出的结论。
章专属复现实验
mkdir -p aosp-android-4.2.2_r1
cd aosp-android-4.2.2_r1
repo init -u https://android.googlesource.com/platform/manifest -b android-4.2.2_r1
repo sync -c
# 只在可恢复的同版本模拟器或测试机采集
adb shell dumpsys gfxinfo
adb shell dumpsys window复现卷III 第6章 深入理解控件系统前先保存主机工具链、manifest与产品目标;android-4.2.2_r1历史分支通常需要隔离的旧工具链环境。与连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口有关的诊断命令只在可恢复模拟器或测试机执行,账号、媒体与设备标识使用隔离样本;现代设备输出不得冒充android-4.2.2_r1结果。
练习、答案与四级证据
练习
问题 1:历史边界。 怎样证明本页没有把当前Android实现倒灌到 android-4.2.2_r1?
问题 2:逐节点证据。 本页 34 个正式坐标如何通过出现、解释、实验与练习四级验收?
问题 3:故障恢复。 面对只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环,如何确认修复而不是掩盖症状?
术语复核与本章回顾
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 初始输入
初始输入在本页用于锁定android-4.2.2_r1的事实坐标与允许输入。
- 调用入口
调用入口在本页用于标出连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口由谁创建、修改与释放状态。
- 状态迁移
状态迁移在本页用于保存能复现正常路径的对象身份和时序。
- 可见反馈
可见反馈在本页用于暴露只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环发生的第一个边界。
- 故障注入
故障注入在本页用于声明故障后重新接收请求所需的恢复条件。
- 复位重放
复位重放在本页用于让独立读者凭窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow得到同一结论。
完成卷III 第6章 深入理解控件系统意味着:能解释连接WindowManager、ViewRootImpl遍历、软硬件绘制、输入派发与Activity窗口,能操作全节点图与诊断切片,能制造只讲View三大流程,遗漏窗口会话、渲染后端和输入反馈闭环,还能凭窗口添加/更新/删除、measure-layout-draw、脏区、DisplayList、焦点、事件消费与PhoneWindow恢复、复位和交接,而不是只在目录中找到关键词。
阅读导航
← 上一页:卷III 第5章 深入理解Android输入系统 · 下一页:卷III 第7章 深入理解SystemUI →