【Android】系统启动流程分析 —— SystemServer 处理过程

时间:2024-04-04 12:22:37
路径:/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"); }