当前位置: 首页 > news >正文

SystemServer 启动流程

概述

SystemServer 由 Zygote 进程孵化而来。init 进程启动后,会解析 init.rc 文件,启动 Zygote 进程。Zygote 随后会启动 SystemServer

SystemServer 的 main 方法是一个入口,真正的启动工作在一个名为 run 的方法中完成。启动过程分为三个主要阶段:

  1. 引导阶段:启动最小化的、至关重要的基础服务
  2. 核心阶段:启动核心的系统服务,这些服务对 Android 的正常运行至关重要,但可能依赖于引导服务
  3. 其他阶段:启动所有其他的服务,包括图形、传感器、蓝牙等,这些服务通常依赖于前两个阶段的服务

详细启动流程分解

1. 入口:main 方法

frameworks/base/services/java/com/android/server/SystemServer.java

public final class SystemServer {public static void main(String[] args) {new SystemServer().run();}private void run() {// ... 详细的启动逻辑都在这里}
}

非常简单,就是创建一个 SystemServer 实例并调用其 run 方法

2. run 方法内的关键阶段

run 方法非常长,我们聚焦于其分阶段启动服务的逻辑

Phase 1: 准备工作及引导服务

在真正启动服务之前,会进行一些关键的准备工作:

  • 设置默认时区、语言区域等
  • 设置 VM 的一些参数
  • 加载 Android 运行时所需的共享库(如 libandroid_servers.so
  • 创建系统级别的 Context 对象
  • 最重要的是:创建 SystemServiceManager(SSM)和 LooperSSM 是管理所有系统服务生命周期的核心组件,负责启动、注册、以及按阶段回调服务的生命周期方法
// 创建 SystemServiceManager,它是服务的“大管家”
mSystemServiceManager = new SystemServiceManager(mSystemContext);
// 将 SSM 添加到本地服务池,方便其他服务获取和使用
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);// 启动引导服务
startBootstrapServices();

Phase 2: 启动引导服务

startBootstrapServices() 方法启动了最基础、相互依赖最强的服务。这些服务是其他所有服务的基础

  • ActivityManagerService (AMS):
    ○ 作用
    :管理的核心,负责四大组件的生命周期、进程管理、任务栈管理等
    ○ 启动时机:最早启动的服务之一。因为它提供了其他服务注册、管理进程的基本框架。AMS 的 setSystemProcess 方法会将其自身注册到 ServiceManager,并为系统进程创建初始的 Application
    ○ mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
  • PowerManagerService (PMS):
    ○ 作用
    :管理设备的电源状态,如屏幕亮灭、CPU休眠等
    ○ 依赖:需要 AMS 来管理其相关的 wakelocks
    ○ mSystemServiceManager.startService(PowerManagerService.class);
  • PackageManagerService (PMS):
    ○ 作用
    :应用程序包的管理者,负责应用的安装、卸载、权限管理和解析等
    ○ 启动时机:非常早,因为几乎所有服务都需要查询应用信息。它的启动过程非常耗时,因为它要扫描所有已安装的 APK
    ○ PackageManagerService.main(...);
  • 其他关键引导服务:
    ○ DisplayManagerService
    :显示管理
    ○ UserManagerService:多用户管理
    ○ SensorService:传感器服务

Phase 3: 启动核心服务

startCoreServices() 方法启动了一些核心的、非引导但必不可少的服务

  • BatteryService:电池状态服务
  • UsageStatsService:应用使用情况统计服务
  • WebViewUpdateService:WebView 更新服务

Phase 4: 启动其他服务

startOtherServices() 方法是整个启动过程中最长的方法,它启动了剩下的所有服务。这些服务通常依赖于前面启动的引导和核心服务

这个阶段的服务非常多,我们列举几个最重要的:

  • WindowManagerService (WMS):
    ○ 作用
    :窗口管理、屏幕绘制、输入事件分发等
    ○ 依赖:严重依赖 AMS(管理应用窗口)、PowerManagerService(控制屏幕亮灭)、DisplayManagerService(获取显示设备信息)
    wm = WindowManagerService.main(...);
    ○ ServiceManager.addService(Context.WINDOW_SERVICE, wm); // 注册到 ServiceManager
  • InputManagerService (IMS):
    ○ 作用
    :管理输入设备(触摸屏、按键等)并将输入事件分发给合适的窗口
    ○ 依赖:依赖 WMS(获取窗口信息来决定事件目标)
    ○ inputManager = new InputManagerService(...);

一个关键动作:AMS.systemReady()

在所有其他服务都启动完毕后,会调用 ActivityManagerService 的 systemReady 方法。这是一个非常重要的信号,它标志着系统服务已经全部就绪

// 在 startOtherServices 方法的最后
mActivityManagerService.systemReady(() -> {// 当系统真正准备就绪后,会回调这里Slog.i(TAG, "Making services ready");// 启动SystemUI(状态栏、导航栏等)// 显示系统启动完毕的锁屏界面
}, BOOT_TIMINGS_TRACE_LOG);

在 AMS.systemReady() 内部,它会:

  1. 发送 ACTION_BOOT_COMPLETED 广播,通知所有应用系统启动已完成
  2. 启动系统自带的应用程序(如桌面 Launcher)。如果没有 Launcher 启动,用户将看不到任何界面
  3. 完成最终的准备工作

总结与设计思想

阶段主要服务特点与依赖
引导阶段ActivityManagerServicePowerManagerServicePackageManagerServiceDisplayManagerService最小依赖集。这些服务是系统的基石,相互之间存在紧密的依赖关系,必须最先启动
核心阶段BatteryServiceUsageStatsService系统核心功能。这些服务不参与引导,但对系统正常运行至关重要,且依赖引导服务
其他阶段WindowManagerServiceInputManagerServiceBluetoothServiceNotificationManagerService 等功能型服务。这些服务数量庞大,提供具体的系统功能,通常严重依赖于引导和核心服务

设计思想:

  • 解耦与依赖管理:通过分阶段启动,清晰地定义了服务之间的依赖关系。后启动的服务可以安全地调用先启动的服务
  • 并行启动优化SystemServiceManager 会尝试并行启动那些没有相互依赖的服务(例如,在 startOtherServices 阶段),以缩短系统启动时间
  • 生命周期管理:所有系统服务都实现了一个通用的 SystemService 接口。SSM 会在不同的启动阶段回调服务的 onBootPhase(int phase) 方法(如 PHASE_BOOT_COMPLETED),让服务知道系统当前启动到了哪个阶段,以便执行相应的初始化工作
  • “就绪”信号AMS.systemReady() 是系统启动完成的最终标志,它协调了服务启动和应用程序启动之间的衔接

整个流程就像搭建一座大楼:先打地基(引导服务),再建主体结构(核心服务),最后进行装修和安装各种设施(其他服务),最终宣布大楼正式投入使用(systemReady

http://www.dtcms.com/a/365570.html

相关文章:

  • EDVAC:现代计算机体系的奠基之作
  • 影像服务免费方案:GIS Server让GeoTIFF数据在山海鲸中直观呈现
  • PyTorch实战——ResNet与DenseNet详解
  • 关于嵌入式学习——嵌入式硬件2
  • Mac电脑Tomcat+Java项目中 代码更新但8080端口内容没有更新
  • 打破信息洪流:微算法科技(NASDAQ:MLGO)推出一种移动互联网环境下数字媒体热点挖掘算法
  • 01-Redis 发展简史与核心定位解析:从诞生到三大产品矩阵
  • 微信小程序预览和分享文件
  • 从检索的角度聊聊数据结构的演进​
  • Vue 评论组件设计 V1.0
  • 关于linux软件编程15——数据库编程sqlite3
  • Spring Boot配置error日志发送至企业微信
  • EI会议:第七届人工智能与先进制造国际会议(AIAM 2025)
  • 多智能体协作系统(CrewAI)
  • 素材合集!直播间带货音乐BGM合集,抖音直播间常用热门音乐合集,根据中文分类,方便查找
  • AI重塑SaaS:从被动工具到智能角色的技术演进路径
  • Shell 三剑客之 awk 命令详解(理论+实战)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • SDK介绍
  • MCP模型库哪个好?2025年收录12万+服务的AI智能体工具集成平台推荐
  • 面试复习题-kotlin
  • Springboot 练手项目(删除部门-接口开发)
  • Get the pikachu靶场SSRF漏洞 (windows环境)
  • AR技术赋能电力巡检:开启智能安全新时代
  • 前端-安装VueCLI
  • Ubuntu环境下的 RabbitMQ 安装与配置详细教程
  • 【开题答辩全过程】以 基于大数据的地震数据分析系统的设计与实现为例,包含答辩的问题和答案
  • 理解用户需求的方法
  • JDBC的功能和使用
  • 算法 --- 分治(快排)