外观
system_server 是什么?和系统应用是一回事吗?
标准回答
system_server 是 Android 的一个核心进程,承载 AMS、ATMS、WMS、包管理等多种系统服务。可以把它理解成系统里多个管理部门所在的大楼;服务是里面的部门,不能把一个服务名称直接当成进程名称。
Android 启动过程中,init 启动 Zygote,Zygote 创建 system_server,随后 SystemServer 按依赖关系启动各类服务,并推进系统启动阶段。这是典型 Android 启动路径;不同设备的服务清单和具体顺序可能有所调整。
系统应用则是随系统提供或具有相应系统身份的 APK,例如某些设置或设备管理应用。它们通常运行在自己的应用进程,通过 Binder 等方式调用系统服务。预装或平台签名,不等于代码自动运行在 system_server 中,也不等于具备全部权限。
同一个 system_server 中也有主线程、Binder 线程和服务专用线程。服务调用可能在 Binder 线程执行,也可能投递到 Handler;多个服务还可能共享某些锁。如果在关键线程或全局锁内执行耗时任务,影响范围可能超过一个应用,因此系统侧排障必须同时看线程、锁和调用链。
关键机制
- 进程是运行容器,服务是职责模块,线程是具体执行路径。
- SystemServer 负责核心服务启动与启动阶段协调;并非所有系统服务都由它承载。
- 系统应用通常仍在应用进程;权限与运行位置分别判断。
通俗例子
某服务持有公共锁执行慢操作,另一个服务恰好也要这把锁,就可能一起等待。CPU 并不一定很高,但多个应用都感觉系统调用变慢。
追问与回答
system_server 和 SystemUI 怎么区分?
system_server 主要承载系统管理服务;SystemUI 提供状态栏、通知面板等系统界面,通常在自己的进程运行,并调用系统服务。一个负责大量系统管理,一个承载系统界面功能。具体界面职责会随设备形态和厂商实现变化,但二者不是同一个进程。
system_server 卡住,是不是所有线程都停了?
不一定。可能只是某个线程、Binder 线程池或关键共享锁被堵住,其他线程仍在运行。我会先确认哪类请求受影响,找到等待线程和持锁者,再看耗时来源。不能只看到一个调用超时,就断定整个进程完全停止;也不能因为其他线程还在跑就排除系统级故障。
易混淆点
system_server 与 SystemUI 不相同;SurfaceFlinger 也通常不在 system_server 内。系统级 Watchdog 和某个应用的 ANR 是不同故障机制。
参考资料
内容来源
- Android 技术札记 · 原条目
system-server