基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析
主要分析一下SystemServer启动过后的内部逻辑,特别说明一下AMS,WMS都属于SystemServer进程,属于同一个进程
一. SystemServer进程启动流程
基于Android13的系统启动流程分析(五)之Zygote和SystemServer启动流程这篇文章有详细讲解,这里再简单的过一下如何启动的SystemServer
在zygote进程创建过后,会调用forkSystemServer()
来孵化出SystemServer进程,当前该进程创建成功后会反射调用到SystemServer.java的main函数,从而启动完成SystemServer
二. SystemServer主函数分析
main函数会被ZygoteInit的子方法handleSystemServerProcess
反射调用到
frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {new SystemServer().run();
}
继续看看run方法
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", "");}...// Prepare the main looper thread (this thread).// 设置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();// Call per-process mainline module initialization.// 初始化ActivityThread// 创建TelephonyServiceManager,StatsServiceManager,MediaServiceManagerActivityThread.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);...// Start 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 音频相关管理服务} catch (Throwable ex) {...} finally {...}...Looper.loop();// 主线程// 若执行到这里说明主线程意外退出了// 主线程:Looper.prepareMainlooper~ Looper.loop之间throw new RuntimeException("Main thread loop unexpectedly exited");}
以上方法可以看出来关于其他服务的启动都是运行在主线程中的Looper.prepareMainlooper~ Looper.loop之间,每个SystemServer中的服务都有一个binder,会加入到ServiceManager的binder线程池中统一管理,这样拿到全局的ServiceManager,根据AIDL 获取到每Service了
- startBootstrapServices(t)
启动系统启动所需的一系列关键服务:
AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService等 - startCoreServices(t)
启动核心服务:BatteryService,GpuService等 - startOtherServices(t)
启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等
在这些启动的服务里(调用了onStart启动服务),都会将服务存入ServiceManager 用来管理系统中的各种Service,用于系统C/S架构中的Binder机制通信:Client端要使用某个Service,则需要先到ServiceManager查询Service的相关信息,然后根据Service的相关信息与Service所在的Server进程建立通讯通路,这样Client端就可以使用Service了
核心服务(startCoreServices) | 作用 |
---|---|
BatteryService | 管理电池相关的服务 |
GpuService | 硬件显示服务 |
WebViewUpdateService | WebView更新服务 |
引导服务(startBootstrapServices) | 作用 |
---|---|
ActivityManagerService | 负责四大组件的启动、切换、调度 |
PowerManagerService | 计算系统中和Power相关的计算,然后决策系统应该如何反应 |
Installer | 系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务 |
LightsService | 管理和显示背光LED |
DisplayManagerService | 用来管理所有显示设备 |
PackageManagerService | 用来对apk进行安装、解析、删除、卸载等等操作 |
SensorService | 为系统提供各种感应器服务 |
其他服务(startOtherServices) | 作用 |
---|---|
CameraService | 摄像头相关服务 |
AlarmManagerService | 全局定时器管理服务 |
InputManagerService | 管理输入事件 |
WindowManagerService | 窗口管理服务 |
BluetoothService | 蓝牙管理服务 |
PackageManagerService | 用来对apk进行安装、解析、删除、卸载等等操作 |
SensorService | 为系统提供各种感应器服务 |
LocationManagerService | 定位管理服务 |
… | … |
1. startBootstrapServices
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {// 尽早启动看门狗,以便在早期启动过程中出现死锁时使系统服务器崩溃t.traceBegin("StartWatchdog");// 启动看门狗,看门狗需要定时喂狗,若喂狗超时则会触发重启,以便知道进程和服务是否正常运行final Watchdog watchdog = Watchdog.getInstance();watchdog.start();t.traceEnd();...t.traceBegin("StartInstaller");// 通过mSystemServiceManager来启动Installer服务,管理应用的安装与卸载Installer installer = mSystemServiceManager.startService(Installer.class);t.traceEnd();...// 通过mSystemServiceManager来启动UriGrantsManagerService,管理Urit.traceBegin("UriGrantsManagerService");mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);t.traceEnd();// 通过mSystemServiceManager来启动PowerStatsService,管理电源状态t.traceBegin("StartPowerStatsService");mSystemServiceManager.startService(PowerStatsService.class);t.traceEnd();...t.traceBegin("StartActivityManager");// 通过mSystemServiceManager来启动ActivityTaskManagerService,管理Activity任务栈ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();// 启动ActivityManagerService,管理Activity等mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);// 让ActivityManagerService拿到systemServer,例如可以通过mSystemServiceManager来判断系统是否启动完成mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);mWindowManagerGlobalLock = atm.getGlobalLock();t.traceEnd();...// 启用PowerManagerService服务,电源管理服务t.traceBegin("StartPowerManager");mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);t.traceEnd();...// 启动屏幕亮度服务,比如亮度调整t.traceBegin("StartLightsService");mSystemServiceManager.startService(LightsService.class);t.traceEnd();// 启动屏幕显示服务t.traceBegin("StartDisplayManager");mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);t.traceEnd();...// 启动PMS,包管理服务mPackageManagerService = PackageManagerService.main(mSystemContext, installer,domainVerificationService, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF,mOnlyCore);} finally {Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");}...// 启动传感器服务t.traceBegin("StartSensorService");mSystemServiceManager.startService(SensorService.class);t.traceEnd();t.traceEnd(); // startBootstrapServices}
可以看到大多数服务都是通过mSystemServiceManager.startService
来启动,核心服务和其他服务都是一样的,就不过多分析了
可以先看看startService方法内容
public <T extends SystemService> T startService(Class<T> serviceClass) {try {final String name = serviceClass.getName();...final T service;try {// 反射拿到该java类Constructor<T> constructor = serviceClass.getConstructor(Context.class);service = constructor.newInstance(mContext);} ...// 将当前服务(java类)加入SystemService服务队列中,统一管理startService(service);return service;} finally {Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);}}public void startService(@NonNull final SystemService service) {// 将当前服务加入mServices队列中mServices.add(service);// Start it.long time = SystemClock.elapsedRealtime();try {// 调用当前服务的onStart来启动服务service.onStart();} catch (RuntimeException ex) {...}warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");}
可以看到startService方法就是反射拿到服务类,然后加入队列中,调用其onStart方法进行启动
2. ServiceManager服务管理
每个属于SystemServer的服务都将加入到ServiceManager的binder线程池中,以供后续直接获取和管理
就拿BatteryService服务来讲解
mSystemServiceManager.startService(BatteryService.class);
已知startService后会调用BatteryService服务的onStart方法,继续看看onStart内部
@Overridepublic void onStart() {...mBinderService = new BinderService();// 将BinderService服务加入ServiceManager中publishBinderService("battery", mBinderService);mBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();// 将batteryproperties服务加入ServiceManager中publishBinderService("batteryproperties", mBatteryPropertiesRegistrar);// 将BinderService服务加入到LocalServices中publishLocalService(BatteryManagerInternal.class, new LocalService());}
继续看看mBinderService
具体是什么,又是如何加入到ServiceManager中的
private final class BinderService extends Binder {...}
可以看到mBinderService
就是一个Binder,然后调用publishBinderService
加入到ServiceManager中的binder线程池中
protected final void publishBinderService(...) {ServiceManager.addService(name, service, allowIsolated, dumpPriority);}
调用ServiceManager.addService
加入到binder线程池中(ServiceManager暂不深究,只知其内部维护了binder线程池),而ServiceManager服务早就在rc文件中作为核心服务启动了,所以具体实现都是c++代码
service servicemanager /system/bin/servicemanagerclass core animationuser systemgroup system readproccriticalonrestart restart apexdonrestart restart audioserveronrestart restart gatekeeperdonrestart class_restart mainonrestart class_restart halonrestart class_restart early_halwritepid /dev/cpuset/system-background/tasksshutdown critical
三. 总结
其实SystemServer是通过init fork出来的,父进程就是zygote,而zygote父进程就是init进程。
SystemServer内部逻辑主要就是创建了核心服务,引导服务,其他服务,例如WMS,PMS,电池服务,蓝牙服务等。这些服务都不是单独的进程,而是都属于SystemServer进程,启动这些服务过后会将这些服务加入ServiceManager的binder线程池中,因为这些服务内部都创建了Binder实例,再加入到了ServiceManager的binder线程池中,以便与随时获取服务与只通信
参考文章:Android系统启动流程(三)解析SyetemServer进程启动过程
基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析相关推荐
- 基于Android13的系统启动流程分析(三)之FirstStageMain阶段
Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲FirstStageMain阶段 (若分析有误敬请指教) 本章讲解的方向和你将收获的知 ...
- Android系统启动流程分析之安装应用
2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295) (0) 举报 收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...
- 【SemiDrive源码分析】【X9芯片启动流程】09 - X9平台系统启动流程分析
[SemiDrive源码分析][X9芯片启动流程]09 - X9平台系统启动流程分析 一.X9 芯片介绍 二.OSPI1_ONLY boot (0000)启动方式(Nor + eMMC) 2.1 Se ...
- Android 7.0系统启动流程分析
随着Android版本的升级,aosp项目中的代码也有了些变化,本文基于Android 7.0分析Android系统启动流程.当我们按下电源键后,整个Android设备大体经过了一下过程: 今天我们 ...
- c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...
在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...
- 基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用
Meta分析是针对某一科研问题,根据明确的搜索策略.选择筛选文献标准.采用严格的评价方法,对来源不同的研究成果进行收集.合并及定量统计分析的方法,最早出现于"循证医学",现已广泛应 ...
- 基于 arm64 Linux nanosleep 系统调用流程分析
nanosleep (高分辨率睡眠)可实现纳秒级的睡眠,暂停调用线程的执行.在 Linux 内核中是如何实现的?下面基于 arm64 cpu 架构去分析. #include <time.h> ...
- 快速谱峭度matlab,一种基于快速谱峭度分析的泵潜在空化故障检测方法与流程
本发明属于信号处理领域,尤其涉及一种基于快速谱峭度分析泵的实时状态并且检测其潜在空化故障的方法. 背景技术: 高性能离心泵在当今社会上广泛应用和需求巨大.由于工作在高压高速等复杂条件下,离心泵的空化故 ...
- 掌握基于switch语句的流程控制测试分析 1221
掌握基于switch语句的流程控制测试分析 1221 01 02
最新文章
- 案例:Oracle dul数据挖掘 磁盘损坏dul提取数据文件中表的数据及l
- ExternalDocumentationLinkImpl(url=https://developer.android.com/reference/, packageListUrl=https://d
- NOIP模拟测试28「阴阳·虎·山洞」
- qml: C++调用qml函数
- ubuntu远程连接windows工具rdesktop
- 高一数学集合知识点整理_高一 | 数学 “集合”知识点总结及归纳~
- Java并发编程-AQS源码之条件队列
- c语言数组用户注册登入管理系统_学生成绩管理系统案例
- AvtiveMQ与SpringBoot结合
- Sysbench 性能压测-MySQL
- koa2 从入门到进阶之路 (五)
- mysql丢数据无法启动mysql_mysql InnoDB数据无法启动解决办法
- Matlab——噪声的检测和处理实验
- python参考手册第四版_Python参考手册 PDF 第4版
- 计算机语言的拼音,语言拼音_语言的拼音和组词_怎么写语言拼音
- 警惕|这类人千万不要转行学IT
- matlab求包络线拟合,MATLAB 一堆散点如何求包络线
- 最近穷疯了只好吃馒头
- Android dex修复工具,安卓热修复----手动加载dex文件到设备并执行
- LessonTableViewEdit