这篇文章主要讲了 Android 系统中 SystemServer 的核心功能,以及如何通过 Systrace 工具分析其性能表现,通俗来说:
一、SystemServer:Android 系统的 “中央司令部”
SystemServer 是 Android 系统启动后运行的核心进程,像 “中央司令部” 一样管理所有系统服务,比如:
- ActivityManagerService(AMS) :管应用的 “生老病死”(启动、暂停、关闭应用)。
- WindowManagerService(WMS) :管所有窗口的位置、大小和显示顺序(比如状态栏、应用界面)。
- 输入系统:接收触摸、按键等输入信号,传给对应应用。
二、用 Systrace 看系统 “慢动作”
Systrace 像给系统拍 “慢动作视频”,记录各组件工作时间线,重点关注:
1. 窗口动画:应用启动的 “舞台切换”
- 当点击应用图标时,Launcher 先显示一个临时启动窗口(StartingWindow),等应用第一帧画好后,再切换到应用的真实窗口。
- 动画由 Android.Anim 和 Android.Anim.lf 两个线程负责,前者处理普通动画,后者(Android P 新增)专门优化窗口动画,避免卡顿。
2. AMS:应用的 “户籍管理员”
- AMS 负责启动应用进程、管理 Activity 生命周期(如 ActivityStart、Resume、Pause 等)。
- 通过 Systrace 能看到 AMS 启动新进程的耗时,比如 “Start proc” 事件记录了启动应用的时间线。
3. WMS:窗口的 “布局设计师”
- WMS 负责计算每个窗口的位置和大小(如 relayoutWindow 事件),并与 SurfaceFlinger 协作将窗口显示到屏幕。
- 例如,应用启动时 WMS 会创建 SurfaceControl(窗口句柄),并通知 SurfaceFlinger 合成画面。
4. 输入系统:系统的 “耳朵”
- 由 InputReader(读输入信号)和 InputDispatcher(分发信号)组成,像 “耳朵” 接收触摸 / 按键,再传给对应应用。
5. Binder 通信:服务间的 “电话网络”
- SystemServer 通过 Binder 与应用通信(如 AMS 调应用进程),但如果通信太繁忙(比如多个应用同时请求),会因 “占线” 导致卡顿。
6. 后台线程:各司其职的 “工作组”
- UiThread:处理前台 UI 相关任务(如 AMS 的 UI 更新),优先级高。
- IoThread:处理 IO 操作(如存储读写),避免阻塞主线程。
- AnimationThread:专门处理窗口动画,Android P 新增 SurfaceAnimationThread 分担工作,减少卡顿。
- BackgroundThread:处理低优先级任务(如电池统计、垃圾回收)。
三、如何用 Systrace 找卡顿原因?
- 看动画线程:如果 Android.Anim 或 SurfaceAnimationThread 耗时过长,会导致窗口切换卡顿。
- 查 Binder 通信:Binder 线程频繁 “monitor contention”(锁竞争),说明服务间通信太忙,需优化。
- 查 AMS/WMS 事件:比如 relayoutWindow 耗时久,可能是窗口布局复杂,需简化界面层级。
四、总结:SystemServer 的 “工作链条”
plaintext
用户点击应用 → AMS启动进程 → WMS创建窗口 → 应用绘制第一帧 → 动画线程切换窗口 → SurfaceFlinger合成显示
Systrace 像 “监控摄像头”,通过分析各环节的时间线(如线程耗时、Binder 通信、动画切换),能精准定位系统卡顿的 “罪魁祸首”,帮助开发者优化性能。