WMS及UI渲染底层原理学习
WMS及UI渲染底层原理学习
文章目录
- WMS及UI渲染底层原理学习
- 前言:
- 一、系统进程基础:Zygote与System Server
- 二、AMS(Activity Manager Service)核心原理
- 三、WMS(Window Manager Service)核心定位
- 四、UI绘制流程:从invalidate到屏幕显示
- 1. invalidate触发的绘制链路
- 2. ViewRootImpl的三大核心步骤(performTraversals)
- 五、Activity、Window与View的协作关系
- 1. 核心分工
- 2. 关键交互流程(以onResume为例)
- 3. setContentView的本质
- 六、渲染底层核心概念
- 总结
前言:
之前学习了ams但是云里物理的,所以决定从上层到底层纵向的去学,因为博主也不太懂所以搞的有点乱 = =,感觉读wms需要的基础知识还是非常非常多的。
一、系统进程基础:Zygote与System Server
-
Zygote的核心作用
- 作为Android系统的"进程孵化器",是所有应用进程和系统关键进程的父进程。
- 通过
fork()
方法创建新进程(fork()
会返回两次,通过PID区分父进程和子进程)。
-
System Server进程
- 是Zygote fork的第一个进程,负责启动和管理90+系统服务(所有系统服务均为
SystemService
子类)。 - 由
SystemServiceManager
协助管理这些系统服务,统一调度服务的启动、生命周期及交互。
- 是Zygote fork的第一个进程,负责启动和管理90+系统服务(所有系统服务均为
二、AMS(Activity Manager Service)核心原理
-
AMS的类结构
- AMS本身并非直接继承
SystemService
,而是通过定义静态内部类Lifecycle extends SystemService
,间接具备SystemService
的特性,实现系统服务的管理规范。 - AMS实现了AIDL接口,作为服务端提供跨进程调用能力(如组件生命周期管理、进程调度等)。
- AMS本身并非直接继承
-
AMS创建新应用进程流程
- AMS通过IPC机制(基于Socket)通知Zygote创建新进程,采用C/S架构(AMS为客户端,Zygote为服务端)。
- Zygote在预加载资源(preload)后,会创建
ZygoteServer
管理Socket,等待AMS的进程创建请求,收到请求后通过fork()
创建应用进程。
三、WMS(Window Manager Service)核心定位
- 核心功能:负责Android系统的窗口显示管理,是UI渲染的"总调度员",没有WMS则无法完成任何视图的显示。
- 关键作用:管理窗口的创建、布局、层级、显示/隐藏,协调窗口与Surface的绑定,是连接应用UI与底层渲染的核心桥梁。
四、UI绘制流程:从invalidate到屏幕显示
1. invalidate触发的绘制链路
当调用View.invalidate()
(如TextView.invalidate()
)时,触发如下逻辑:
- 标记无效区域:从当前View开始,递归向上通知父容器(直至根布局),记录受影响的绘制区域(避免全量重绘,优化性能)。
- 触发根布局绘制:无效区域标记传递到根布局后,由
ViewRootImpl
执行performTraversals
(核心入口为doTraversal
方法),启动绘制流程。
2. ViewRootImpl的三大核心步骤(performTraversals)
ViewRootImpl
是连接View树与WMS的关键类,其performTraversals
方法触发View树的完整绘制流程,包含三个核心阶段:
- 1. onMeasure:测量View的宽高(根据父容器约束计算子View的尺寸)。
- 2. onLayout:确定View在父容器中的位置(坐标计算)。
- 3. onDraw:实际绘制内容到画布(Canvas),通过
onPerformDraw()
方法获取Surface,完成绘制操作。
五、Activity、Window与View的协作关系
1. 核心分工
- Activity:UI控制器,负责业务逻辑与生命周期管理(生命周期由AMS通过跨进程通信控制),不直接管理显示,而是通过Window承载View。
- Window:View的容器,每个Activity对应一个Window(默认),负责承接View树并与WMS交互,是View显示的"载体"。
- View/ViewGroup:UI元素的具体表现,通过View树组织,最终通过Window渲染到屏幕。
2. 关键交互流程(以onResume为例)
-
AMS通过跨进程调用(Binder)触发Activity的
onResume
生命周期。 -
Activity在
onResume
中获取Window的decorView
(顶级View,包含标题栏、内容区等)。
-
通过
WindowManager.addView(decorView, params)
将decorView
添加到Window:WindowManagerImpl
将操作转交给WindowManagerGlobal
执行。WindowManagerGlobal
创建ViewRootImpl
,调用setView()
方法,通过addToDisplayAsUser()
发起跨进程请求。- 请求经
Session
类传递到WMS的addWindow()
方法(WMS在此处校验窗口合法性、分配层级等)。 - WMS创建
WindowState
(窗口在Framework中的占位符,类似ActivityRecord
对应Activity),并触发requestLayout()
,通过scheduleTraversals
将绘制任务加入主线程消息队列。
3. setContentView的本质
- 解析XML布局文件,通过反射构建View树,并将View树关联到当前Activity的Window中。
- 此时View树仅完成构建,需等待
ViewRootImpl
与WMS交互后,才能通过Surface完成最终显示。
六、渲染底层核心概念
-
Surface与Canvas
- 一个Window对应一个Surface(绘图表面),Canvas是Surface上的"画布",View的
onDraw
通过Canvas绘制内容。 - Surface是跨进程的图形缓冲区,应用进程通过Canvas在Surface上绘制,最终由底层合成显示。
- 一个Window对应一个Surface(绘图表面),Canvas是Surface上的"画布",View的
-
SurfaceControl与WindowState
SurfaceControl
:管理Surface的底层句柄,负责Surface的创建、销毁、属性设置(如尺寸、透明度)。WindowState
:WMS中表示窗口的抽象对象,记录窗口的层级、位置、状态等信息,用于WMS的窗口管理。
-
SurfaceFlinger与Vsync
- SurfaceFlinger:独立进程,负责将多个应用的Surface合并为一帧画面,提交给硬件显示(解决多窗口叠加问题)。
- GraphicBuffer:当Surface数据量>1MB时,通过共享内存传递(而非Binder),避免Binder传输限制。
- Vsync信号:垂直同步信号,用于协调应用绘制与SurfaceFlinger合成的节奏,避免画面撕裂。
Framework世界中对应的站位符
activity--activityRecord
service--serviceRecord
Application--Process
window--windowState
canvas--surface--SurfaceControl{ surface }//底层
总结
WMS是UI显示的核心管理者,协调Activity、Window、View的交互;View的绘制通过invalidate
触发,经ViewRootImpl
调度measure-layout-draw
流程;最终通过Surface、SurfaceFlinger及Vsync信号完成从绘制到屏幕显示的全链路。理解这些底层原理,能更清晰地把握Android UI渲染的性能优化方向与问题定位思路。