SystemServer 进程启动分析二

140 阅读5分钟

android 系统中 SystemServer 进程启动的第二阶段(Java 层初始化与服务启动)的核心逻辑:

一、SystemServer 的入口:从 main 方法到 run 流程

SystemServer 的启动始于 com.android.server.SystemServer.main() 方法,核心逻辑封装在 run() 中,分为 准备阶段 和 服务启动阶段

1. 初始化准备:系统环境配置

java

public static void main(String[] args) {
    new SystemServer().run(); // 实例化并启动
}

private void run() {
    try {
        // 阶段1:基础环境初始化
        initBeforeStartServices(); // 包含时间、时区、内存等配置
        createSystemContext();     // 创建系统上下文
        initSystemServiceManager();// 初始化服务管理器
        // 阶段2:启动所有系统服务
        startBootstrapServices();  // 基础核心服务(如 AMS、PMS)
        startCoreServices();       // 核心功能服务(如电池、传感器)
        startOtherServices();      // 其他服务(如 UI、网络)
        Looper.loop();             // 进入消息循环,维持进程运行
    } catch (Exception e) {
        // 异常处理与日志记录
    }
}

二、准备阶段:初始化系统运行环境

1. 系统基础配置

  • 时间与时区

    • 修复系统时间早于 1970 年的异常,设置默认时区为 GMT。
    • 合并语言 / 地区配置到 persist.sys.locale,统一系统本地化设置。
  • 内存与性能

    java

    VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); // 设置堆内存利用率
    VMRuntime.getRuntime().clearGrowthLimit(); // 移除内存增长限制
    
    • 优化 SystemServer 的内存使用,确保长时间运行的稳定性。
  • Binder 与线程配置

    java

    Binder.setWarnOnBlocking(true); // 禁止 Binder 阻塞调用
    BinderInternal.setMaxThreads(15); // 增加 Binder 线程数量
    android.os.Process.setThreadPriority(THREAD_PRIORITY_FOREGROUND); // 设置前台优先级
    
    • 确保跨进程通信(IPC)的高效性和实时性。

2. 创建系统上下文(createSystemContext)

  • ActivityThread 的作用
    SystemServer 模拟应用进程,通过 ActivityThread.systemMain() 创建主线程,获取系统上下文(mSystemContext)和 UI 上下文(systemUiContext)。

    java

    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext(); // 系统上下文
    
    • ActivityThread 负责管理应用组件生命周期,此处用于获取系统资源(如 framework-res.apk 中的资源)。
  • LoadedApk 与资源加载
    通过 LoadedApk 加载系统资源模块(framework-res.apk),其包名固定为 "android",提供全局系统资源(如颜色、布局)。

3. 服务管理初始化

java

mSystemServiceManager = new SystemServiceManager(mSystemContext); // 服务管理器
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
  • SystemServiceManager 负责创建、启动和管理所有系统服务,维护服务列表(ArrayList<SystemService>)。
  • 服务需继承 SystemService 抽象类,通过 startService() 方法注册并启动。

三、服务启动阶段:三阶段启动策略

1. 第一阶段:启动引导服务(startBootstrapServices)

核心基础服务,相互依赖强,优先启动

  • Installer:通过 Binder 与 installd 守护进程通信,管理应用安装(如 APK 安装路径校验)。

  • ActivityManagerService (AMS) :系统服务的核心,管理应用生命周期、任务栈和进程调度。

    java

    mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
    
  • PackageManagerService (PMS) :管理应用包信息,初始化时检查是否为首次启动(isFirstBoot())。

  • PowerManagerService:电源管理,控制屏幕亮度、休眠策略等。

2. 第二阶段:启动核心服务(startCoreServices)

系统功能支撑服务,依赖引导服务

  • BatteryService:监听电池状态,广播电量变化(如低电量提醒)。
  • UsageStatsService:收集应用使用统计数据(如应用启动次数、运行时长)。
  • WebViewUpdateService:管理系统 WebView 组件的更新,确保浏览器兼容性。
  • SensorService:初始化传感器驱动,提供加速度计、陀螺仪等传感器数据。

3. 第三阶段:启动其他服务(startOtherServices)

多样化功能服务,依赖前两阶段服务

  • UI 相关服务

    • WindowManagerService (WMS):管理窗口布局、触摸事件分发。
    • InputMethodManagerService:输入法管理,处理键盘输入。
  • 网络与连接服务

    • NetworkManagementService:网络策略控制(如流量限制)。
    • ConnectivityService:网络连接状态监听(Wi-Fi、移动数据)。
  • 系统监控服务

    • Watchdog:监控系统主线程卡顿,触发 ANR 日志。
    • BugreportManagerService:生成系统错误报告,用于调试。

4. 服务就绪与桌面启动

在 ActivityManagerService.systemReady() 中:

  • 调用 startHomeOnAllDisplays() 启动 Launcher(桌面应用),标志系统启动完成。
  • 触发 PHASE_THIRD_PARTY_APPS_CAN_START 阶段,允许第三方应用启动。

四、关键机制:Looper 与服务生命周期

1. Looper 循环

java

Looper.prepareMainLooper(); // 初始化主线程 Looper
Looper.loop(); // 进入无限循环,处理系统消息(如服务回调、事件通知)
  • SystemServer 主线程通过 Looper 维持运行,处理来自 Binder 调用、定时器等事件。

2. 服务生命周期管理

  • 创建阶段:通过 SystemServiceManager.startService() 实例化服务对象。
  • 启动阶段:调用服务的 onStart() 方法(如 AMS 初始化进程监控)。
  • 就绪阶段:在 systemReady() 中调用服务的 systemReady() 方法(如网络服务配置策略)。

五、总结:SystemServer 的核心作用

  1. 系统服务中枢:承载 AMS、PMS、WMS 等核心服务,提供跨进程通信(Binder)和系统功能支撑。

  2. 启动流程分层:通过三阶段启动策略确保服务依赖关系,先基础后扩展,避免循环依赖。

  3. 持续运行:通过 Looper 循环保持进程存活,响应系统事件(如应用启动、屏幕旋转)。

类比说明
SystemServer 如同「城市市政中心」,各系统服务是不同职能部门(如交通局、电力局):

  • 引导服务:类似市政基础设施(如供水、供电),必须优先启动。

  • 核心服务:类似公共服务(如警察局、医院),依赖基础设施运行。

  • 其他服务:类似便民服务(如图书馆、公园),丰富系统功能。

通过这一流程,Android 系统完成从「内核初始化」到「用户可用状态」的过渡,为应用提供稳定的运行环境。