当前位置: 首页 > 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.dtcms.com/a/317661.html

相关文章:

  • 【STM32 LWIP配置】STM32H723ZG + Ethernet +LWIP 配置 cubemx
  • 无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用
  • 中宇联5G云宽带+4G路由器:解锁企业办公高效协同与门店体验升级
  • 图解 Claude Code 子智能体 Sub-agent
  • [ java GUI ] 图形用户界面
  • 【软考系统架构设计师备考笔记4】 - 英语语法一篇通
  • ctfshow_vip题目限免-----SVN漏洞,git泄露
  • Git Cherry-Pick 指南
  • Leetcode——菜鸟笔记1
  • Git 分支管理:从新开发分支迁移为主分支的完整指南
  • 鸿蒙app 开发中 全局弹窗类的封装 基于PromptAction
  • C#之基础语法
  • 机器学习之朴素贝叶斯
  • Suno API V5模型 php源码 —— 使用灵感模式进行出创作
  • 基于PHP的论坛社交网站系统开发与设计
  • 排序算法详解
  • 媒体资产管理系统和OCR文字识别的结合
  • Ethereum: L1 与 L2 的安全纽带, Rollups 技术下的协作与区别全解析
  • 解决启动docker报错Cannot connect to the Docker daemon问题
  • 阿里 Qwen-Image:开源 20B 模型引领图像生成新纪元,中文渲染超越 GPT-4o!
  • 数据结构与算法的认识
  • 手动开发一个TCP服务器调试工具(二):无界面 TCP 通信服最小实现
  • ETF期权分仓的风险如何管理?
  • 基于Hadoop的股票大数据分析可视化及多模型的股票预测研究与实现
  • 四十、【高级特性篇】接口用例数据驱动:引入随机变量与动态数据生成
  • 生成式模型 ?判别式模型?用【猫狗分类器】帮助理解!
  • 【网络安全】入侵检测系统 Suricata 概述 | IDS
  • 2025年大语言模型与多模态生成工具全景指南(V2.0)
  • PyCharm vs. VSCode 到底哪个更好用
  • 5个数据库 存储系统精选 | C/C++ 项目深度解析