| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> android R版本应用程序窗口流程源码分析 -> 正文阅读 |
|
[移动开发]android R版本应用程序窗口流程源码分析 |
????????应用启动时,Activity组件在启动之后(生命周期部分参见android R版本应用程序启动过程源码分析),在执行完onResume生命周期之后会执行添加窗口到系统、计算窗口大小和位置、应用执行measure-layout-draw、系统窗口状态刷新、系统动效(动效部分参见android R版本AppTransition动效源码分析)这几个动作。 1、 addWindow阶段 ????????Activity的启动本质实际最终也是使用WindowManager去addView(add一个DecorView对象)进而使得wms调用addWindow增加一个WindowState对象,而Activity的addView动作发生在Activity.onResume之后(冷起activity才会有addView),也就是说只要onResume执行不完,肯定不会添加窗口到wms,依据activity指定的主题此时屏幕会显示主题色比如黑色白色(跨栈跳转场景则显示StartingWindow)等。此时创建出来的WindowState对应的状态mDrawState是NO_SURFACE(查看方法使用adb shell dumpsys window windows,具体参见android R版本常见dump信息分析),addWindow操作会注册InputChannel到IMS以便窗口能够接受input事件,添加窗口如果要通过applogcat查看,需要使用命令adb shell wm logging enable-text WM_DEBUG_ADD_REMOVE WM_DEBUG_FOCUS打开日志然后搜索关键字“Adding Window”或者“addWindow”进行查询。 addWindow流程图: ????????ActivityThread.handleResumeActivity中执行完resume生命周期后添加窗口(页面新起才执行此分支,如果页面从后台拉到前台无添加窗口流程) addView函数中会先触发ViewRootImpl的构造,此对象负责与wms进行交互,构造好ViewRootImpl对象后,addView会调用ViewRootImpl.setView,ViewRootImpl.setView中会执行以下两个动作: 1)requestLayout:向Choreography注册一个CALLBACK_TRAVERSAL的TraversalRunnable回调,等待Vsync信号触发执行此TraversalRunnable,此TraversalRunnable的作用是触发measure、layout、draw这三个动作并通知wms去relayoutWindow 2)mWindowSession.addToDisplayAsUser:该函数最终binder到wms去addWindow,addWindow时会创建一个mDrawState状态是NO_SURFACE的WindowState对象,并且为该WindowState对象创建SurfaceControl,并将该SurfaceControl设置为ActivityRecord对应的SurfaceControl的子节点(startActivity阶段创建ActivityRecord添加到Task时会给ActivityRecord创建SurfaceControl) requestLayout函数: ?addWindow函数(Activity窗口WindowState的mToken就是对应的ActivityRecord): 2、 relayoutWindow阶段 ? ? ? ? addWindow阶段应用进程已经往Choreography注册一个CALLBACK_TRAVERSAL的TraversalRunnable回调,在下一帧的Vsync信号到来时会执行此TraversalRunnable。TraversalRunnable的作用是触发measure、layout、draw这三个动作并通知wms去relayoutWindow。 relayoutWindow时wms会给新创建的WindowState设置状态mDrawState为DRAW_PENDING以及为窗口创建BufferStateLayer图层的SurfaceControl对象。relayoutWindow如果要通过applogcat查看,需要使用命令adb shell wm logging enable-text WM_DEBUG_SCREEN_ON打开日志然后搜索关键字“Relayout Window”进行查询。 relayoutWindow流程图: 该TraversalRunnable主要完成以下几个动作: 1)measureHierarchy:调用performMeasure触发DecorView的measure从根节点一直遍历到叶子节点计算各级View的大小 2)relayoutWindow:调用mWindowSession.relayout触发wms去relayoutWindow,该函数依序会先把WindowState的WindowStateAnimator的状态mDrawState复位为DRAW_PENDING,然后创建WindowSurfaceController对象,在创建WindowSurfaceController对象时会给WindowSurfaceController创建一个SurfaceControl(即最终的BufferStateLayer),并将该SurfaceControl设置为WindowState的SurfaceControl的子节点 3)performMeasure:若应用measureHierarchy得到的宽高与系统relayoutWindow返 4)performLayout:触发DecorView的layout从根节点一直遍历到叶子节点计算各级View的位置 5)performDraw:触发DecorView的draw从根节点一直遍历到叶子节点计算各级View的位置,绘制时要区分是否硬件加速场景,硬件加速场景:注册硬件加速绘制完成的回调,在回调 measureHierarchy函数:relayoutWindow函数:performMeasure函数:performLayout函数:performDraw函数:pendingDrawFinished函数: 3、 finishDrawingWindow阶段 ????????wms.finishDrawingWindow会触发requestTraversal执行系统Traversal任务, Traversal任务会去执行WindowState.commitFinishDrawingLocked把WindowState状态mDrawState设置为READY_TO_SHOW,这一步如果状态异常,需要从系统侧出发进行分析。 finishDrawingWindow如果要通过applogcat查看,需要使用命令adb shell wm logging enable-text WM_DEBUG_ADD_REMOVE打开日志然后搜索关键字“finishDrawingWindow”进行查询。系统侧wms的Traversal任务除了会触发WindowState.commitFinishDrawingLocked,还会执行GOODTOGO流程触发WindowState.performShowLocked把WindowState状态mDrawState设置为HAS_DRAWN。 ? ? ? |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:03:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |