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 的核心作用
-
系统服务中枢:承载 AMS、PMS、WMS 等核心服务,提供跨进程通信(Binder)和系统功能支撑。
-
启动流程分层:通过三阶段启动策略确保服务依赖关系,先基础后扩展,避免循环依赖。
-
持续运行:通过 Looper 循环保持进程存活,响应系统事件(如应用启动、屏幕旋转)。
类比说明:
SystemServer 如同「城市市政中心」,各系统服务是不同职能部门(如交通局、电力局):
-
引导服务:类似市政基础设施(如供水、供电),必须优先启动。
-
核心服务:类似公共服务(如警察局、医院),依赖基础设施运行。
-
其他服务:类似便民服务(如图书馆、公园),丰富系统功能。
通过这一流程,Android 系统完成从「内核初始化」到「用户可用状态」的过渡,为应用提供稳定的运行环境。