title: 【从零写OS内核】334 SystemServer 启动服务管理机制
category: os
tag: [android, systemserver, zygote, binder]
source: https://github.com/golang12306/os-kernel-from-scratch
【从零写OS内核】334 SystemServer 启动服务管理机制
1. 什么是 SystemServer?
Android 的 Java 世界里,所有系统服务都不住在应用进程里。它们跑在一个特殊的进程——SystemServer 里。Android 设计者把整个框架层服务集中在这个进程中管理,通过 Binder 机制供应用调用。
类比 Windows NT:NT Executive 有一个类似的 Services.exe,负责管理 Windows 服务。Android 的 SystemServer 可以理解成 Android 版的服务管理器。
# 查看 Android 系统服务
adb shell dumpsys -l | head -50# 查看 SystemServer 进程 PID
adb shell ps -A | grep system_server2. 启动流程:from Zygote to SystemServer
SystemServer 不是 init 启动的。它的上一站是 Zygote——Android 第一个 fork 出来的进程:
┌──────────────┐
│ init.rc │ → 启动 zygote 进程
└──────┬───────┘
│
▼
┌──────────────┐
│ ZygoteInit │ → fork()+预加载类
└──────┬───────┘
│ fork()
▼
┌──────────────────────────────────┐
│ SystemServer.main() │ ← 我们在这里
└──────┬───────────────────────────┘
│
▼
┌──────────────────────────────────┐
│ startSystemServer() │
│ 启动所有系统服务 │
└──────────────────────────────────┘Zygote 预加载了常用类(节省每个应用启动时的类加载时间),然后 fork 出 SystemServer。
3. SystemServer 核心代码解析
Android 9 之后源码路径:frameworks/base/services/java/com/android/server/
关键文件:
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/core/java/android/os/SystemService.java3.1 main() 入口
// frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
private void run() {
// 1. 创建主线程 Looper
Looper.prepareMainLooper();
// 2. 加载 native 服务(AudioFlinger, SurfaceFlinger 等)
System.loadLibrary("android_servers");
// 3. 创建 SystemServerManager
mSystemServerManager = new SystemServerManager(
Looper.getMainLooper());
// 4. 启动引导服务
startBootstrapServices();
// 5. 启动核心服务
startCoreServices();
// 6. 启动其他服务
startOtherServices();
// 7. 进入消息循环
Looper.loop();
}
}3.2 服务分类(Android 14 对比 Android 9)
// 引导服务 — 必需服务,失败会导致系统无法启动
private void startBootstrapServices() {
// ActivityTaskManagerService — 窗口管理核心
// PowerManagerService — 电源管理
// LightsService — LED 背光
// DisplayService — 屏幕服务
// PackageManagerService — 包管理
}
// 核心服务 — 重要但可以延迟加载
private void startCoreServices() {
// BatteryService — 电池服务
// UsageStatsService — 使用统计
// WebViewUpdateService — WebView 更新
}
// 其他服务 — 可选服务
private void startOtherServices() {
// 音频服务 AudioService
// 相机服务 CameraService
// 蓝牙服务 BluetoothService
// Wi-Fi 服务 WifiService
// ... 50+ 服务
}3.3 SystemService 机制
每个服务继承 SystemService:
// 伪代码示例
public class MySystemService extends SystemService {
public MySystemService(Context context) {
super(context);
}
@Override
public void onStart() {
// 发布服务到 ServiceManager
publishBinderService("my_service", new Binder());
}
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_SYSTEM_SERVICES_READY) {
// 系统服务就绪
}
}
}4. Boot Phase 机制
SystemServer 用阶段码管理服务启动顺序:
// phases = [
// PHASE_WAIT_TIME_DEBUGGER = 0,
// PHASE_SYSTEM_SERVICES_STARTING = 100,
// PHASE_PHASE_WAIT_TIME_DEFAULT_DONE = 200,
// PHASE_SYSTEM_SERVICES_READY = 300,
// PHASE_PHASE_ACTIVITY_MANAGER_READY = 400,
// PHASE_PHASE_THIRD_PARTY_APPS_CAN_START = 500,
// ]┌─────────────────────────────────────────┐
│ Phase 0 PHASE_WAIT_TIME_DEBUGGER │ 调试器等待
├─────────────────────────────────────────┤
│ Phase 100 PHASE_SYSTEM_SERVICES_STARTING │ 核心系统服务启动
├─────────────────────────────────────────┤
│ Phase 300 PHASE_SYSTEM_SERVICES_READY │ 系统服务就绪
├─────────────────────────────────────────┤
│ Phase 400 PHASE_PHASE_ACTIVITY_MANAGER_READY │ AMS 就绪
├─────────────────────────────────────────┤
│ Phase 500 PHASE_THIRD_PARTY_APPS_CAN_START │ 第三方应用可启动
└─────────────────────────────────────────┘5. ServiceManager 注册机制
所有服务通过 Binder 暴露给应用:
// 服务注册
private void publishBinderService(String name, IBinder service) {
ServiceManager.addService(name, service);
}
// 客户端获取服务
IBinder binder = ServiceManager.getService("power");
// 等价于:
// IBinder binder = ServiceManager.getService("power");
PowerManager power = new PowerManager(
ContextImpl.getImplForMessenger(), binder);5.1 查看注册了哪些服务
adb shell service list# 输出示例
All services:
alarm [android.app.IAlarmManager]
android.app.usage.IPackageUsageStats
SurfaceFlinger [android.ui.ISurfaceComposer]
android.security.keystore IKeystoreService
...5.2 服务依赖拓扑
┌─────────────────────────┐
│ PowerManagerService │ ← 依赖 BatteryService
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ DisplayManagerService │ ← 依赖 PMS, PMS 依赖 Setting
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ ActivityTaskManager │ ← 依赖 PackageManagerService
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ WindowManagerService │ ← 依赖 ATMS
└─────────────────────────┘6. Watchdog 监控机制
SystemServer 启动时启动 Watchdog,监控所有服务是否卡死:
// Watchdog 每 30 秒检查一次
private final Handler mMonitorHandler = new Handler(mLooper) {
public void handleMessage(Message msg) {
// 检查所有服务线程是否响应
}
};
// 监控特定服务
watchdog.addMonitorThread(serviceName, serviceThread);
// 卡住超过阈值 → 杀掉 SystemServer → init 重启Windows 对应机制:Service Control Manager (SCM) 有类似超时检测。
7. Android 与 Windows NT 服务管理对比
| 维度 | Android SystemServer | Windows NT SCM |
|---|---|---|
| 进程模型 | 单进程多线程 | 多进程各自独立 |
| 服务注册 | ServiceManager (Binder) | Registry HKLMSystemCurrentControlSetServices |
| 启动触发 | Zygote fork | boot/start 类型 |
| 依赖管理 | 内部拓扑,无声明式依赖 | sc config dep=[] 声明 |
| 健康监控 | Watchdog 单进程内 | SC failure actions |
| 通信方式 | Binder IPC | LPC/RPC |
8. 调试实践
# 查看 SystemServer 启动日志(过滤关键阶段)
adb logcat -s SystemServer:* ActivityTaskManager:* WindowManager:*
# 查看服务依赖(dumpsys 依赖分析)
adb shell dumpsys activity -a | grep "mServices"
# 查看 Watchdog 状态
adb shell dumpsys watchdog
# 模拟服务超时(测试 Watchdog)
# 在源码中注入人为 delay 测试// 在调试时注入服务延迟
public class MyService extends SystemService {
@Override
public void onStart() {
SystemClock.sleep(60000); // 人为延迟 60s 触发 Watchdog
publishBinderService("my_service", new Binder());
}
}9. 小结
启动顺序:
ZygoteInit ──fork──► SystemServer.main()
│
├── startBootstrapServices() (核心)
├── startCoreServices() (电池/统计)
└── startOtherServices() (50+ 服务)
│
┌─────────────┴─────────────┐
依赖 Binder 依赖 ServiceManager
│ │
▼ ▼
ActivityTask WindowManager
Manager ServiceSystemServer 是 Android Java 层的服务中枢。掌握它的启动顺序、Binder 注册机制、Watchdog 监控,你就理解了 Android 框架层的半壁江山。
微信公众号
· 深入浅出技术解读 ☕️
· 欢迎搜索关注「码农的螺丝刀」
评论