前言
SystemServer 进程主要用于创建系统服务,诸如 AMS、WMS、PMS 都是由它创建的,本篇会延续之前的结构,接着分析 SystemServer 进程的启动和处理过程。
SystemServer 任务
- 启动 Binder 线程池,这样就可以与其他进程进行通信
- 创建 SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期
- 启动各种系统服务
SystemServer 进程启动过程
时序图如下:
启动Binder线程池
在上图中可知通过 ZygoteInit.nativeZygoteInit() 启动 Binder 线程池,这样 SystemServer 进程就可以使用 Binder 与其他进程进行通信。nativeZygoteInit 是一个 Native 方法,其对应的 JNI 文件如下:
/frameworks/base/core/jni/AndroidRuntime.cpp
int register_com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env)
{
const JNINativeMethod methods[] = {
{ "nativeZygoteInit", "()V",
(void*) com_android_internal_os_ZygoteInit_nativeZygoteInit },
};
return jniRegisterNativeMethods(env, "com/android/internal/os/ZygoteInit",
methods, NELEM(methods));
}
static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
gCurRuntime->onZygoteInit();
}
这里的 gCurRuntime 是 AndroidRuntime 类型的指针,具体指向 AndroidRuntime 的子类 AppRuntime ,它在 app_main.cpp 中定义:
/frameworks/base/cmds/app_process/app_main.cpp
virtual void onZygoteInit()
{
sp<ProcessState> proc = ProcessState::self();
ALOGV("App process: starting thread pool.\n");
proc->startThreadPool();
}
startThreadPool 方法启动一个 Binder 线程池,这样 SystemServer 进程就可以使用 Binder 与其他进程进行通信了。
解析SystemServer 进程
由上述时序图中可知最终调用了 SystemServer 的 main 方法:
/frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
进而查看 run 方法:
private void run() {
try {
......
//创建消息 Looper
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
//加载动态库 android_servers.so
System.loadLibrary("android_servers");
performPendingShutdown();
// 创建系统的 Context
createSystemContext();
// 创建系统的 SystemServiceManager
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
SystemServerInitThreadPool.get();
} finally {
traceEnd();
}
try {
traceBeginAndSlog("StartServices");
// 启动引导服务
startBootstrapServices();
// 启动核心服务
startCoreServices();
// 启动其他服务
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
......
}
可以看出 run 方法中主要工作是:创建系统 Context、创建系统 SystemServerManager、启动系统服务。
部分系统服务及作用
引导服务 | 作用 |
---|---|
Installer | 系统安装APK时的服务类,启动完成Installer服务之后才能启动其他系统服务 |
ActivityManagerService | 负责四大组件的启动、切换、调度 |
PowerManagerService | 计算系统中和Power相关的计算,然后决策系统应该如何反应 |
LightsService | 管理和显示背光LED |
DisplayManagerService | 用来管理所有显示设备 |
UserManagerService | 多用户模式管理 |
SensorService | 为系统提供各种感应器服务 |
PackageManagerService | 用来对APK进行安装、解析、删除、卸载等操作 |
...... | ...... |
核心服务 | |
DropBoxManagerService | 用于生成和管理系统运行时的一些日志文件 |
BatteryService | 管理电池相关的服务 |
UsageStatsService | 收集用户使用每一个App的频率、使用时长 |
WebViewUpdateService | WebView更新服务 |
其他服务 | |
CameraService | 摄像头相关服务 |
AlarmManagerService | 全局定时器管理服务 |
InputManagerSErvice | 管理输入事件 |
WindowManagerService | 窗口管理服务 |
VrManagerService | VR模式管理服务 |
BluetoothService | 蓝牙管理服务 |
NotificationManagerService | 通知管理服务 |
DevicesStorageMonitorService | 存储相关管理服务 |
LocationManagerService | 定位管理服务 |
AudioService | 音频相关管理服务 |
...... | ...... |
网友评论