学习记录:Android14中的显示链路

299 阅读11分钟

View & ViewGroup

1. View是什么

View是Android中所有可视化元素的基类,是屏幕上能被用户看到并交互的 “最小原子”,核心职责分为两部分:

  • 渲染职责:通过measure()(测量自身尺寸)、layout()(确定在父容器中的位置)、draw()(将像素绘制到缓冲区)三个核心流程,完成自身视觉呈现(如TextView绘制文字、ImageView绘制图片);
  •  交互职责:通过dispatchTouchEvent()(事件分发)、onTouchEvent()(事件处理)接收并响应用户的触摸、点击、滑动等输入事件,是用户与APP交互的“直接触点”。

2. ViewGroup是什么

ViewGroup是View的子类,作为“容器型View”,核心作用是管理子View的排列规则和层级,实现复杂页面的布局:

  • 布局规则封装:不同ViewGroup对应不同布局逻辑(如LinearLayout线性排列RelativeLayout相对定位ConstraintLayout约束布局),本质是通过重写onMeasure()/onLayout(),递归完成所有子View的尺寸测量和位置确定;
  • View树构建:一个Android页面的UI本质是一棵“View树”——>根节点是DecorView(ViewGroup),下层包含标题栏、内容区(ContentView)等子ViewGroup,最终叶子节点是Button、TextView等普通View;
  • 事件分发中转:用户触摸事件会先传递到ViewGroup,再由ViewGroup根据子View的位置、可见性等规则,分发到目标子View,实现精准的交互响应。

核心总结:

(1) View是“UI原子”,负责自身渲染和交互;ViewGroup是“布局容器”,负责组织View树、制定布局规则;

(2) 应用通过嵌套ViewGroup和View,构建出任意复杂度的页面布局,通过View的事件回调实现用户交互。

view与viewGroup.png

Activity & ViewRootImpl

1.Activity是什么

Activity(活动,行动)是Android四大组件之一,并非直接参与UI绘制,而是承担两大核心角色:

  • View的生命周期绑定者:Activity通过setContentView()加载布局文件(或动态创建View),将View树与自身生命周期绑定——Activity的onResume()触发View的首次绘制,onPause()暂停View的交互和绘制,onDestroy()递归销毁整个View树;
  • 系统资源竞争参与者:Activity作为AMS管理的“最小资源单元”,会代表应用向系统申请CPU、内存等资源,AMS通过Activity的状态(前台/后台)决定应用进程的优先级,进而仲裁资源分配(如前台Activity的进程优先获取CPU资源)。

View自身无法直接与系统服务通信,必须通过ViewRootImpl完成UI布局的最终落地:

2.ViewRootImpl是什么

View自身无法直接与系统服务通信,必须通过ViewRootImpl完成UI布局的最终落地 所以,它是中间者。

  • ViewRootImpl的创建时机:Activity的onResume()执行后,系统会为Activity的View树创建ViewRootImpl,它是View树的“隐形根节点”(不在View树结构中,但持有DecorView的引用);

  • 核心作用

① 触发View树的measure()layout()draw()全流程,是UI绘制的“总开关”;

② 作为View与WMS的通信中介(通过Binder),向WMS上报View的尺寸、位置,接收WMS的布局指令;

③ 处理系统输入事件(如触摸、按键),将事件分发到View树的目标View。

核心总结

(1) Activity 是 View的“老板”:决定View的生死、为View争取系统资源;

(2) ViewRootImpl 是 View的“执行者”:承接Activity的指令,触发View布局绘制,对接系统服务;

(3)View 是 “干活的”:完成具体的渲染和交互,不关心生命周期和系统通信。

ActivityManagerService

AMS(ActivityManagerService)是System Server中最核心的服务,以Activity为基本颗粒度,实现对应用的全生命周期管控

AMS:基于Activity管控App生命周期、进程调度与资源分配

1. 核心职责

  • Activity生命周期管控:通过ActivityStack/ATMS(Android 10+拆分)管理Activity任务栈,触发Activity的onCreate()/onResume()等生命周期回调,处理页面跳转、回退、多任务切换;
  • 进程调度:根据Activity的启动需求,通过Zygote孵化应用进程;维护进程优先级(前台进程>可见进程>后台进程),触发低内存回收(LMK)杀死低优先级进程;
  • 资源分配与权限管控:仲裁不同应用的资源竞争(如CPU/内存分配),校验Activity启动的权限(如后台启动Activity的限制),是应用与系统资源之间的“仲裁者”。

2. AMS与View/Activity的关联

AMS不直接接触View,仅通过管控Activity间接影响View:

  • AMS通知Activity启动——> Activity创建View树——> ViewRootImpl触发View绘制;
  • AMS将Activity标记为“后台状态”→系统降低应用进程优先级→View的绘制帧率降低(节省资源);
  • AMS销毁Activity——> Activity递归销毁View树 ——> View释放资源。

核心总结:

(1)AMS是“应用大管家”:只认Activity,不管View,通过管控Activity实现对应用的整体调度;

(2)AMS的决策(如进程优先级、Activity状态)会间接决定View的渲染资源和生命周期。

Window

1. Window的本质:系统级的“UI展示容器”

Window是Android中承载所有可视化内容的 抽象 载体,是WMS管理的最小单元,核心特征:

  • 每个Activity默认对应一个PhoneWindow(Window的子类),Activity的View树最终挂载在PhoneWindow的DecorView上;
  • Window是“无实体的画布”:本身不可见,但定义了UI的显示区域、交互规则,是连接Activity与WMS的核心媒介;
  • 一个应用可拥有多个Window:除了Activity的主Window。 Dialog、Toast、悬浮窗等都会创建独立的Window。

2. Activity与Window的绑定逻辑

640.png

  • DecorView是Window的“根View”:封装了标题栏、导航栏、内容区等系统级UI结构,Activity的View树仅占DecorView的“内容区”;

  • Activity的核心作用是“填充Window内容”:Window由系统创建,Activity负责将View树挂载到Window上,让Window有“可显示的内容”。

核心总结:

(1) Window是“系统级UI容器”,WMS专门管理它;Activity是“内容填充者”,负责为Window提供View树

(2) 关系类比:Window是“空房间”, Activity是“装修师傅”,View是“家具”——师傅把家具放进房间,房间的大小、位置由系统(WMS)决定。

WindowManagerService

WMS(WindowManagerService)是System Server中负责窗口管理的核心服务,以Window为基本颗粒度,实现对所有系统窗口的统一管控

WMS:基于Window实现系统窗口的全生命周期管理

1. 核心职责

  •  Window生命周期管理:为每个Window创建WindowState对象,管理Window的创建、显示、隐藏、销毁,响应AMS的Window创建/销毁指令;
  • 窗口层级管理:定义严格的窗口层级规则(从下到上):

壁纸层 → 应用窗口层(Activity) → 子窗口层(Dialog) → 系统窗口层(状态栏/导航栏) → 悬浮窗层

  • 布局计算:结合DMS提供的显示设备参数(屏幕分辨率、可用区域),计算每个Window的位置、大小,处理分屏、多窗口、悬浮窗的布局适配;

  • 事件分发:接收InputManagerService(IMS)的触摸/按键事件,根据Window的位置、焦点状态,将事件精准分发给目标Window的ViewRootImpl;

  • Surface申请:为每个Window向SurfaceFlinger申请Surface(绘图缓冲区),维护Window与Surface的绑定关系。

2. WMS与其他组件的关联

  • 与AMS:接收AMS的Window创建指令,向AMS反馈Window的焦点/可见状态(如Window隐藏→AMS触发Activity.onPause);
  • 与DMS(DeviceManagerService):获取显示设备的配置(分辨率、刷新率),适配多屏显示的Window布局;
  • 与SurfaceFlinger:传递Window的层级、位置信息,让SurfaceFlinger完成最终的图层合成。

核心总结:

(1) WMS是“窗口总管理员”:管所有Window的位置、层级、交互,是Window与SurfaceFlinger之间的“中介”

(2) WMS不关心Window内的View内容,只关心Window的整体属性(位置、大小、层级)。

Surface

1. Surface的本质:“绘图缓冲区”(生产者-消费者模型)

Surface是Android中用于绘制图像的内存缓冲区,核心特征:

  • 采用“生产者-消费者”模型:应用(View)是“生产者”,向Surface写入绘制数据;SurfaceFlinger是“消费者”,从Surface读取数据进行合成;
  • 每个Surface对应一块GraphicBuffer(基于Gralloc分配的显存),避免CPU与GPU之间的频繁数据拷贝,保证渲染性能。

2. Android系统常见的Surface图层(按层级从下到上)

图层类型对应Window/Surface来源作用
壁纸层壁纸服务的Window显示桌面壁纸
应用窗口层Activity的PhoneWindow显示应用的核心UI
子窗口层Dialog/Toast的Window显示应用的弹窗/提示
系统窗口层状态栏/导航栏/锁屏的Window显示系统核心UI
悬浮窗层悬浮窗/输入法的Window显示顶层交互UI

3. 普通View渲染到Surface的流程

641.png

  • 关键细节:View的绘制数据不会直接到屏幕,而是先写入Surface的显存缓冲区,SurfaceFlinger按需读取;

  • ViewRootImpl是View与Surface的“写入中介”,负责将View树的绘制结果批量写入Surface。

4. 特殊View(SurfaceView/TextureView)的独立Surface处理

对于视频播放、3D渲染等高性能场景,普通View的共享Surface会成为性能瓶颈,因此Android设计了专用View:

  •  SurfaceView:申请独立的Surface(脱离Activity主Window的Surface),由WMS单独管理,视频数据直接写入该Surface,与GUI层Surface并行
  • TextureView:基于SurfaceTexture封装,将视频数据转为OpenGL纹理,融入普通View树(无独立Surface),支持对视频的裁剪、旋转等操作
  • 核心差异:SurfaceView有独立Layer(层),性能更高;TextureView无独立Layer,灵活性更强。

核心总结:

Surface是“绘图显存缓冲区”,是View绘制数据与SurfaceFlinger之间的“数据载体”

普通View共享Activity主Window的Surface,特殊View拥有独立Surface,满足高性能渲染需求。

SurfaceFlinger

SurfaceFlinger管理Surface合成到Display(显示器),VSync同步整个显示框架

1. DMS:Display的“硬件管家”

DMS(DisplayManagerService)是显示设备的基础管理服务,核心作用:

  • 管理物理/虚拟显示设备(主屏、外接显示器、投屏),维护显示参数(分辨率、刷新率、色域);
  • 向WMS/SurfaceFlinger提供显示设备的硬件信息,是“显示硬件与系统服务的中介”。

2. SurfaceFlinger:图层合成的“最终执行者”

SurfaceFlinger是运行在独立进程的核心服务,负责将所有Surface合成为最终的屏幕图像

ac03294ad81fbe00a3d7ffd9edc79e81.png

• 合成方式:优先使用HWC(硬件合成),由显示芯片直接合成图层,性能高、功耗低;复杂场景用GPU合成。

3. VSync信号:整个显示框架的“同步时钟”

VSync(垂直同步)信号由Display硬件生成(如60Hz屏幕每16.6ms一次),核心作用:

  • 同步View绘制:Choreographer接收VSync信号后,触发ViewRootImpl的performTraversals()(measure/layout/draw),保证View绘制节奏与屏幕刷新率一致;
  • 同步SurfaceFlinger合成:SurfaceFlinger在VSync信号到来时,统一合成所有Layer,避免“屏幕撕裂”;
  • 核心价值:消除绘制与合成的异步性,保证画面流畅。

核心总结:

(1) DMS(DisplayManagerService)管“显示硬件参数”, SurfaceFlinger管“图层合成”

(2) VSync是“全局同步时钟”,让View绘制、SurfaceFlinger合成、屏幕显示保持节奏一致

(3) FrameBuffer是“最终帧缓冲区”,合成后的图像写入此处,由Display硬件直接读取显示。

完整链路总结(View→Display)

用户操作→View接收交互事件→Activity处理业务逻辑→AMS管控Activity生命周期→  
Activity填充Window内容→WMS管理Window布局/层级→WMS为Window申请Surface→  
View绘制数据写入Surface→SurfaceFlinger合成所有Surface的Layer→  
SurfaceFlinger将合成图像写入FrameBuffer→Display硬件显示图像

各核心组件的关键角色

  1. AMS(ActivityManagerService):管控Activity生命周期、进程调度,是“应用资源的仲裁者”;
  2. WMS(windowManagerService):管控Window布局、层级、事件分发,是“窗口的管理者”;
  3. DMS(DisplayMnagerService):管控显示设备参数,是“显示硬件的中介”;
  4. SurfaceFlinger:管控图层合成、VSync同步,是“图像合成的最终执行者”;
  5. Activity:View的生命周期总管,Window的内容填充者;
  6. View:UI渲染与交互的最小单元,Surface的数据生产者;
  7. Window:WMS的管理单元,Surface的载体;
  8. Surface: View绘制数据的显存缓冲区,Layer的数据来源。

核心关键点回顾:

  1. 整个显示体系的核心逻辑是“分层解耦”:View管绘制、Activity管生命周期、Window管系统交互、Surface管数据载体、SurfaceFlinger管合成、Display管硬件输出;

  2. AMS/WMS/DMS/SurfaceFlinger各司其职:AMS管应用、WMS管窗口、DMS管显示硬件、SurfaceFlinger管图像合成;

  3. VSync信号是全局同步核心,保证绘制、合成、显示的节奏一致,是画面流畅的关键。

image.png

学习总结来自: Linux系统框架(三)Android显示体系链路解析:从View到Display的流转