当前位置: 首页 > news >正文

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

  1. Zygote的核心作用

    • 作为Android系统的"进程孵化器",是所有应用进程和系统关键进程的父进程。
    • 通过fork()方法创建新进程(fork()会返回两次,通过PID区分父进程和子进程)。
  2. System Server进程

    • 是Zygote fork的第一个进程,负责启动和管理90+系统服务(所有系统服务均为SystemService子类)。
    • SystemServiceManager协助管理这些系统服务,统一调度服务的启动、生命周期及交互。

二、AMS(Activity Manager Service)核心原理

  1. AMS的类结构

    • AMS本身并非直接继承SystemService,而是通过定义静态内部类Lifecycle extends SystemService,间接具备SystemService的特性,实现系统服务的管理规范。
    • AMS实现了AIDL接口,作为服务端提供跨进程调用能力(如组件生命周期管理、进程调度等)。
  2. 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为例)

  1. AMS通过跨进程调用(Binder)触发Activity的onResume生命周期。

  2. Activity在onResume中获取Window的decorView(顶级View,包含标题栏、内容区等)。
    在这里插入图片描述

  3. 通过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完成最终显示。

六、渲染底层核心概念

  1. Surface与Canvas

    • 一个Window对应一个Surface(绘图表面),Canvas是Surface上的"画布",View的onDraw通过Canvas绘制内容。
    • Surface是跨进程的图形缓冲区,应用进程通过Canvas在Surface上绘制,最终由底层合成显示。
  2. SurfaceControl与WindowState

    • SurfaceControl:管理Surface的底层句柄,负责Surface的创建、销毁、属性设置(如尺寸、透明度)。
    • WindowState:WMS中表示窗口的抽象对象,记录窗口的层级、位置、状态等信息,用于WMS的窗口管理。
  3. 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渲染的性能优化方向与问题定位思路。

http://www.lryc.cn/news/611915.html

相关文章:

  • ROG 掌机 X:便携游戏新宠,开启微观生存冒险
  • JAVA 程序员cursor 和idea 结合编程
  • OpenAI最新开源:GPT-OSS原理与实践
  • 需求如何映射到开发计划中
  • 江协科技STM32 15-1 FLASH闪存
  • Unity模型显示在UI上
  • IDS知识点
  • 在ubuntu上使用jenkins部署.net8程序
  • 【网络安全】入侵检测系统 Suricata 概述 | IDS
  • DHCP 服务器与DNS服务器
  • 如何将照片从POCO手机传输到Mac电脑
  • Linux基础命令的生产常用命令及其示例简单解释
  • Mac 洪泛攻击笔记总结补充
  • Vue2中实现数据复制到 Excel
  • OceanBase DBA实战营2期--自动分区分裂学习笔记
  • 虚幻GAS底层原理解剖四 (TAG)
  • 《爬虫实战指南:轻松获取店铺详情,开启数据挖掘之旅》
  • Adobe Analytics 数据分析平台|全渠道客户行为分析与体验优化
  • 时隔六年!OpenAI 首发 GPT-OSS 120B / 20B 开源模型:性能、安全与授权细节全解
  • 【WAIC 2025】AI安全的攻防前线:合合信息AI鉴伪检测技术
  • 算法训练营DAY55 第十一章:图论part05
  • 支持向量机(SVM)算法依赖的数学知识详解
  • 非机动车识别mAP↑28%!陌讯多模态融合算法在智慧交通的实战解析
  • Unity里的对象旋转数值跳转问题的原理与解决方案
  • Linux《进程间通信(上)》
  • Android 之 Kotlin中的符号
  • Linux---第二天---基础指令
  • 基于Python的超声波OFDM数字通信链路设计与实现
  • 2024年测绘程序设计比赛--空间探索性分析(数据为2025年第三次模拟数据)
  • 基于MCP提示构建工作流程自动化的实践指南