Administrator
发布于 2026-08-12 / 24 阅读
0
0

说下你对安卓 wms 和 ams 的流程的理解

AMS = ActivityManagerService,管四大组件、任务栈、进程生命周期;WMS = WindowManagerService,管窗口、Surface、Z 序、输入、屏幕显示;二者紧密协作:AMS 控制 Activity 生命周期,决定「要不要显示页面」;WMS 负责「页面长什么样、怎么渲染、怎么接收触摸」。

前置:都属于 SystemServer 里启动的核心系统服务,运行在 system_server 进程。


一、AMS(ActivityManagerService)核心职责

  1. 管理 Activity、Service、Broadcast、ContentProvider 四大组件

  2. 维护 Activity 任务栈 TaskRecord / ActivityRecord,管控启动模式、返回栈

  3. 进程管理:ProcessRecord,判断进程优先级、内存不足时杀进程(LMK)

  4. 管控应用启动、权限校验、ANR 检测(Activity/Service/Broadcast ANR)

  5. 和 Zygote 交互:需要新进程时,通知 Zygote fork 应用进程

关键数据结构(面试常问)

  • ActivityRecord:代表一个 Activity 实例记录

  • TaskRecord:任务栈,一组 ActivityRecord

  • ProcessRecord:App 进程信息,维护 uid、pid、adj(进程优先级)

✅ 经典流程:App 冷启动 /startActivity 核心链路(精简版)

从 App 调用 startActivity() 开始

  1. 应用端 Context.startActivity → Binder 调用 AMS

  2. AMS 做校验:权限、Intent、目标 Activity 是否存在、跨应用权限

  3. AMS 检查目标进程是否存在

    • ✅ 进程存在:直接调度,resume 目标 Activity

    • ❌ 进程不存在:通知 Zygote fork 新 App 进程,新进程初始化 ActivityThread

  4. AMS 通知目标 App 的 ActivityThread → scheduleLaunchActivity

  5. App 内部反射创建 Activity,执行生命周期:attach → onCreate → onStart → onResume

  6. onResume 之后,Activity 准备好窗口,请求添加窗口 → 这里开始交给 WMS!

⚠️ 重点分界:AMS 负责把 Activity 走到 onResume,真正窗口、Surface 归 WMS

ANR 补充:AMS 是 ANR 的检测中心,消息超时(主线程阻塞)AMS 触发 ANR、输出 traces。


二、WMS(WindowManagerService)核心职责【影像岗加分,和 Surface / 渲染强相关】

很多人只以为 WMS 管弹窗,其实它和 SurfaceFlinger、Input 体系绑定很深,对你 OpenGL / 相机渲染知识可以联动

  1. 管理所有 Window(窗口),维护窗口树、Z 轴层级(谁盖在谁上面)

  2. 分配 Surface(图形缓冲区,App 渲染画布,OpenGL / 相机预览都用 Surface)

  3. 窗口布局:测量、确定窗口大小(比如 Activity 窗口、Dialog、Toast、系统状态栏)

  4. 输入事件分发源头:InputReader → InputDispatcher → WMS,决定触摸发给哪个窗口

  5. 窗口动画、转场、截窗、权限管控(悬浮窗权限)

  6. 和 SurfaceFlinger 通信:把各个 App 的 Surface 提交给 SurfaceFlinger 做图层合成,最终输出到屏幕

关键结构

  • WindowState:WMS 中一个窗口的记录

  • Surface:图形缓冲区队列(BufferQueue),App 往里面画内容

  • DisplayContent:屏幕窗口根容器

✅ Activity 窗口添加流程(AMS 走到 onResume 后,衔接 WMS)

  1. Activity onResume 后,PhoneWindow 初始化 DecorView

  2. ViewRootImpl 创建,调用 setView()

  3. ViewRootImpl 通过 Binder 向 WMS 发起 addWindow

  4. WMS 校验窗口权限、参数,创建 WindowState,分配 Surface

  5. WMS 通知 SurfaceFlinger 创建 Layer,建立 BufferQueue

  6. App 端通过 Choreographer(VSync 信号)驱动 View 绘制 / OpenGL 渲染,往 Surface 提交 buffer

  7. SurfaceFlinger 合成所有图层 → 送显示硬件


三、AMS 和 WMS 协作关系【面试重中之重,必说】

一句话区分

AMS 管逻辑生命周期(Activity 跑不跑);WMS 管图形窗口(页面能不能看见、能不能点)

联动典型场景:打开 Activity

  1. AMS 调度 Activity,走完 onCreate/onStart/onResume

  2. Activity 就绪后,App 发起 addWindow 到 WMS

  3. WMS 创建窗口 + Surface,安排图层

  4. WMS 通知 SurfaceFlinger 合成,画面才可见

❗ 关键点:Activity onResume ≠ 画面已经显示,onResume 只是逻辑就绪;真正画面上屏,是 WMS+SurfaceFlinger 完成合成之后

联动典型场景:按 Home 键

  1. AMS 把当前 Activity pause,调整任务栈

  2. AMS 通知 WMS,隐藏对应窗口,调整 Z 序,切到 Launcher 窗口

联动典型场景:ANR / 闪退

  • ANR 检测是 AMS;但如果窗口卡死、画面无响应,WMS 负责输入事件判定,配合 AMS 处理


四、【1 分钟口述标准答案|直接背诵,面试首选】

AMS 是 ActivityManagerService,主要管理四大组件、Activity 任务栈、应用进程、ANR 检测;startActivity 冷启动时 AMS 负责校验 Intent、拉起目标进程、调度 Activity 生命周期直到 onResume。

WMS 是 WindowManagerService,负责所有窗口管理、窗口 Z 序布局、分配 Surface、输入事件分发,和 SurfaceFlinger 配合完成图层合成上屏。

两者协作流程:AMS 调度 Activity 走到 onResume 之后,App 通过 ViewRootImpl 向 WMS addWindow;WMS 创建 WindowState、分配 Surface,App 拿到 Surface 之后渲染,SurfaceFlinger 合成最终画面。简单说 AMS 管组件和进程生命周期,WMS 管窗口显示和输入。


五、高频连环追问(提前备好,很容易顺着问)

Q1:Activity onStart 和 onResume 视觉上区别?

onStart:Activity可见,但还没可交互;onResume:Activity 获得焦点,准备接收输入;但哪怕 onResume,窗口 Surface 还不一定准备好,画面不一定渲染出来。

Q2:ViewRootImpl 作用?

是 App 和 WMS 通信的桥梁;DecorView 的根,承载 View 树绘制、Choreographer VSync、addWindow、输入事件接收。

Q3:Surface 和 Window 的关系?

Window 是「窗口逻辑容器」,Surface 是「图形缓冲区」;一个 Window 对应一块 Surface,App 往 Surface 里绘制内容(View 绘制 / OpenGL / 相机预览)。

Q4:AMS 怎么杀进程?adj 是什么?

adj = 进程优先级,前台 Activity 进程 adj 最低优先级最高;内存紧张时 LMK 根据 adj 杀进程,AMS 维护 ProcessRecord 记录 adj。

Q5:为什么弹窗需要 WMS 权限?

悬浮窗属于系统级窗口,WMS 会校验窗口类型和权限,防止恶意 App 覆盖屏幕劫持输入。

Q6(✨你的影像岗加分题,主动可以提)

相机预览、OpenGL 渲染,本质也是拿到 Surface(WMS 分配),Camera/EGL 直接往 Surface 的 BufferQueue 写帧数据,不经过 View 体系,WMS 依然管控这个 Surface 图层的 Z 序和显示。


六、精简 30s 极速版(如果面试官让简短说)

AMS 管控四大组件、任务栈、应用进程与 ANR,负责 startActivity 和 Activity 生命周期调度;WMS 管理窗口层级、Surface、输入分发,对接 SurfaceFlinger 做画面合成。AMS 把 Activity 调度到 onResume 后,App 通过 ViewRootImpl 向 WMS 添加窗口、申请 Surface,之后 App 渲染、SurfaceFlinger 合成上屏。AMS 管逻辑生命周期,WMS 管显示与输入。


评论