主要分析一下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内部逻辑分析相关推荐

  1. 基于Android13的系统启动流程分析(三)之FirstStageMain阶段

    Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲FirstStageMain阶段 (若分析有误敬请指教) 本章讲解的方向和你将收获的知 ...

  2. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  3. 【SemiDrive源码分析】【X9芯片启动流程】09 - X9平台系统启动流程分析

    [SemiDrive源码分析][X9芯片启动流程]09 - X9平台系统启动流程分析 一.X9 芯片介绍 二.OSPI1_ONLY boot (0000)启动方式(Nor + eMMC) 2.1 Se ...

  4. Android 7.0系统启动流程分析

    随着Android版本的升级,aosp项目中的代码也有了些变化,本文基于Android 7.0分析Android系统启动流程.当我们按下电源键后,整个Android设备大体经过了一下过程:  今天我们 ...

  5. c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...

    在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析​zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...

  6. 基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

    Meta分析是针对某一科研问题,根据明确的搜索策略.选择筛选文献标准.采用严格的评价方法,对来源不同的研究成果进行收集.合并及定量统计分析的方法,最早出现于"循证医学",现已广泛应 ...

  7. 基于 arm64 Linux nanosleep 系统调用流程分析

    nanosleep (高分辨率睡眠)可实现纳秒级的睡眠,暂停调用线程的执行.在 Linux 内核中是如何实现的?下面基于 arm64 cpu 架构去分析. #include <time.h> ...

  8. 快速谱峭度matlab,一种基于快速谱峭度分析的泵潜在空化故障检测方法与流程

    本发明属于信号处理领域,尤其涉及一种基于快速谱峭度分析泵的实时状态并且检测其潜在空化故障的方法. 背景技术: 高性能离心泵在当今社会上广泛应用和需求巨大.由于工作在高压高速等复杂条件下,离心泵的空化故 ...

  9. 掌握基于switch语句的流程控制测试分析 1221

    掌握基于switch语句的流程控制测试分析 1221 01 02

最新文章

  1. 案例:Oracle dul数据挖掘 磁盘损坏dul提取数据文件中表的数据及l
  2. ExternalDocumentationLinkImpl(url=https://developer.android.com/reference/, packageListUrl=https://d
  3. NOIP模拟测试28「阴阳·虎·山洞」
  4. qml: C++调用qml函数
  5. ubuntu远程连接windows工具rdesktop
  6. 高一数学集合知识点整理_高一 | 数学 “集合”知识点总结及归纳~
  7. Java并发编程-AQS源码之条件队列
  8. c语言数组用户注册登入管理系统_学生成绩管理系统案例
  9. AvtiveMQ与SpringBoot结合
  10. Sysbench 性能压测-MySQL
  11. koa2 从入门到进阶之路 (五)
  12. mysql丢数据无法启动mysql_mysql InnoDB数据无法启动解决办法
  13. Matlab——噪声的检测和处理实验
  14. python参考手册第四版_Python参考手册 PDF 第4版
  15. 计算机语言的拼音,语言拼音_语言的拼音和组词_怎么写语言拼音
  16. 警惕|这类人千万不要转行学IT
  17. matlab求包络线拟合,MATLAB 一堆散点如何求包络线
  18. 最近穷疯了只好吃馒头
  19. Android dex修复工具,安卓热修复----手动加载dex文件到设备并执行
  20. LessonTableViewEdit

热门文章

  1. 【卫朋】结构设计:如何使用 PROE 导出 CAD 文件?
  2. Linux抓包工具tcpdump使用小结
  3. 日期选择器中禁用日期设置
  4. 手把手教你实现一个「以图搜图」
  5. Rockchip3066 修改开机 LOGO 和开机动画
  6. 计算机软件水平高级考试内容,全国计算机软件专业资格和水平考试高级程序员级试题及答案.docx...
  7. 台式计算机清灰,电脑清理灰尘,教您怎样清理台式电脑灰尘
  8. 基于SDN的DDoS攻击检测与防御
  9. PuTTY 中文教程A
  10. C语言函数及分文件编程