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 版的服务管理器。

Bash
# 查看 Android 系统服务
adb shell dumpsys -l | head -50

Bash
# 查看 SystemServer 进程 PID
adb shell ps -A | grep system_server

2. 启动流程:from Zygote to SystemServer

SystemServer 不是 init 启动的。它的上一站是 Zygote——Android 第一个 fork 出来的进程:

Bash
┌──────────────┐
│  init.rc     │  → 启动 zygote 进程
└──────┬───────┘
       │
       ▼
┌──────────────┐
│  ZygoteInit  │  → fork()+预加载类
└──────┬───────┘
       │ fork()
       ▼
┌──────────────────────────────────┐
│  SystemServer.main()              │  ← 我们在这里
└──────┬───────────────────────────┘
       │
       ▼
┌──────────────────────────────────┐
│  startSystemServer()              │
│  启动所有系统服务                   │
└──────────────────────────────────┘

Zygote 预加载了常用类(节省每个应用启动时的类加载时间),然后 fork 出 SystemServer。

3. SystemServer 核心代码解析

Android 9 之后源码路径:frameworks/base/services/java/com/android/server/

关键文件:

Bash
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/core/java/android/os/SystemService.java

3.1 main() 入口

Java
// 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)

Java
// 引导服务 — 必需服务,失败会导致系统无法启动
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

Java
// 伪代码示例
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 用阶段码管理服务启动顺序:

Java
// 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,
// ]

Bash
┌─────────────────────────────────────────┐
│ 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 暴露给应用:

Java
// 服务注册
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 查看注册了哪些服务

Bash
adb shell service list

Bash
# 输出示例
All services:
  alarm [android.app.IAlarmManager]
  android.app.usage.IPackageUsageStats
  SurfaceFlinger [android.ui.ISurfaceComposer]
  android.security.keystore IKeystoreService
  ...

5.2 服务依赖拓扑

Bash
┌─────────────────────────┐
│ PowerManagerService     │ ← 依赖 BatteryService
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│ DisplayManagerService   │ ← 依赖 PMS, PMS 依赖 Setting
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│ ActivityTaskManager     │ ← 依赖 PackageManagerService
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│ WindowManagerService    │ ← 依赖 ATMS
└─────────────────────────┘

6. Watchdog 监控机制

SystemServer 启动时启动 Watchdog,监控所有服务是否卡死:

Java
// 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. 调试实践

Bash
# 查看 SystemServer 启动日志(过滤关键阶段)
adb logcat -s SystemServer:* ActivityTaskManager:* WindowManager:*

# 查看服务依赖(dumpsys 依赖分析)
adb shell dumpsys activity -a | grep "mServices"

# 查看 Watchdog 状态
adb shell dumpsys watchdog

# 模拟服务超时(测试 Watchdog)
# 在源码中注入人为 delay 测试

Java
// 在调试时注入服务延迟
public class MyService extends SystemService {
    @Override
    public void onStart() {
        SystemClock.sleep(60000); // 人为延迟 60s 触发 Watchdog
        publishBinderService("my_service", new Binder());
    }
}

9. 小结

Bash
启动顺序:
ZygoteInit ──fork──► SystemServer.main()
                        │
                        ├── startBootstrapServices()  (核心)
                        ├── startCoreServices()        (电池/统计)
                        └── startOtherServices()       (50+ 服务)
                                                │
                                  ┌─────────────┴─────────────┐
                              依赖 Binder              依赖 ServiceManager
                                  │                           │
                                  ▼                           ▼
                            ActivityTask              WindowManager
                            Manager                   Service

SystemServer 是 Android Java 层的服务中枢。掌握它的启动顺序、Binder 注册机制、Watchdog 监控,你就理解了 Android 框架层的半壁江山。


微信公众号
· 深入浅出技术解读 ☕️
· 欢迎搜索关注「码农的螺丝刀」

最后修改: 2024年1月14日

作者

评论

发表评论

您的邮箱地址不会被公开。