【Android】系统启动流程分析 —— SystemServer 处理过程
路径:/frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
...
try {
...
// 设置系统语言、国家、时区相关。
if (!SystemProperties.get("persist.sys.language").isEmpty()) {
final String languageTag = Locale.getDefault().toLanguageTag();
SystemProperties.set("persist.sys.locale", languageTag);
SystemProperties.set("persist.sys.language", "");
SystemProperties.set("persist.sys.country", "");
SystemProperties.set("persist.sys.localevar", "");
}
...
// 设置 main 线程的优先级,有此可得主线程就是 SystemServer 进程下的其中线程。
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
// 开始主线程的运行,和 Looper.loop 配对使用。
// 运行在 Looper.prepareMainLooper() ~ Looper.loop(),之间的就是运行在主线程中。
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
...
// 初始化 native services,加载 android_servers 库(libandroid_servers.so)。
System.loadLibrary("android_servers");
...
// 通过 ActivityThread 来创建 system 上下文。
createSystemContext();
// 初始化 ActivityThread,创建 TelephonyServiceManager、StatsServiceManager、MediaServiceManager。
ActivityThread.initializeMainlineModules();
// 将 SystemServer 加入 ServiceManager(binder 线程池)。
// 每个继承自 SystemServer 或属于 SystemServer 进程的服务都将加入到 ServiceManager 中的线程池中。
ServiceManager.addService("system_server_dumper", mDumper);
mDumper.addDumpable(this);
// 每个 server 基本上对应了一个 manager,对外提供的 API 也是只能获取到 manager。
// 创建 SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理,启动系统的各种服务。
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
mDumper.addDumpable(mSystemServiceManager);
// LocalServices 是 system_server 进程中各个服务提供的本地服务。
// system_server 进程中每个服务都可以往 LocalServices 放对象。
// 有些核心服务是继承自 SystemServer,LocalServices 是公开缓存池目的是解耦。
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
...
}
...
// 启动 Services。
try {
t.traceBegin("StartServices");
// 启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。
startBootstrapServices(t);
// 启动核心服务:BatteryService,GpuService 等。
startCoreServices(t);
// 启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。
startOtherServices(t);
// 以上的所有服务都由 mSystemServiceManager 来启动,所以都是继承自 SystemServer。
// 分别是引导服务、核心服务和其他服务
// [引导服务]
// Installer 系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务。
// ActivityManagerService 负责四大组件的启动、切换、调度。
// PowerManagerService 计算系统中和Power相关的计算,然后决策系统应该如何反应。
// LightsService 管理和显示背光LED。
// DisplayManagerService 用来管理所有显示设备。
// UserManagerService 多用户模式管理。
// SensorService 为系统提供各种感应器服务。
// PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作。
// [核心服务]
// BatteryService 管理电池相关的服务。
// UsageStatsService 收集用户使用每一个 APP 的频率、使用时常。
// WebViewUpdateService WebView 更新服务。
// [其他服务]
// CameraService 摄像头相关服务。
// AlarmManagerService 全局定时器管理服务。
// InputManagerService 管理输入事件。
// WindowManagerService 窗口管理服务。
// VrManagerService VR模式管理服务。
// BluetoothService 蓝牙管理服务。
// NotificationManagerService 通知管理服务。
// DeviceStorageMonitorService 存储相关管理服务。
// LocationManagerService 定位管理服务。
// AudioService 音频相关管理服务。
...
}
...
// 主线程
Looper.loop();
// 若执行到这里说明主线程意外退出了。
// 主线程:Looper.prepareMainlooper ~ Looper.loop 之间。
throw new RuntimeException("Main thread loop unexpectedly exited");
}