当前位置:   article > 正文

SystemServer简述

systemserver


一、SystemServer是什么?

SystemServer就是系统用来启动service的入口
Android系统在启动的时候,在启动两个重要的进程,一个是Zygote进程
另一个是由zygote进程fork出来的system_server进程;
SystemServer会启动我们在系统中所需要的一系列service

二、Fork

Fork系统调用用来创建一个新进程(子进程),它与原进程(调用fork的进程)同时进行,
原进程被称为父进程;

Fork不需要参数并且返回一个整数值;
fork()返回的不同值:
负值:创建子进程失败;
:返回到新创建的子进程;
正值:返回父进程或者调用者。该值包含新创建的子进程的进程ID;

Fork函数用来创建一个与当前进程映像一样的子进程,所创建的子进程将复制父进程的代码段,数据 段,BSS段,堆,栈等所有用户空间信息;在内核中操作系统会重新为其申请一个子进程执行的位置;

当进程调用fork后控制转入内核,内核会做4件事;
1.分配新的内存块和内核数据结构给子进程
2.将父进程部分数据结构内容(数据结构,堆栈等)拷贝到子进程
3.添加子进程到系统进程列表中
4.fork返回开始调度器调度

三、相关原理介绍

SystemServer是Android系统中重要的进程,系统中主要的服务驻留在其中:
常见的比如WindowManagerServer(WMS),ActivityManagerService(AMS),
PackageManagerServer(PMS),这些系统服务都存在于SystemServer进程中;

此进程在系统中的名称为“system_server”。
因此,SystemSever负责启动系统的各项服务,Android系统中Java世界的核心 Service都在这里启动

SystemServer大体分以下几个步骤:
1.初始化一些零碎事务
2.createSystemContext初始化 system_server 进程的context
3.startBootstrapServices启动系统Boot级别服务
4.startCoreServices启动系统级别核心服务
5.startOtherServices启动其它类型服务,主要是厂家可以根据实际情况配置的服务

SystemSever启动服务过程中,SystemServiceManager的startBootPhase()贯穿system_server进程以及服务的整个启动过程;

ps -A | grep system_server
我们在 Linux系统下连接Android 设备后,使用ps -A | grep system_server命令,可以看到system_server在系统中的进程号。
其中PID所对应的值就是system_server在系统中的进程号;

ps -Ao USER,PID,PPID,CMD -T +进程ID
然后我们现使用ps -Ao USER,PID,PPID,CMD -进程ID这个命令结果(从结果中可以知道AMS.PMS,WMS都是system_server进程中的线程,其中 WMS比较特殊,它的线程名是android.display):

下面这张图是Zygote启动SystemServer的流程:
在这里插入图片描述

1:fork SystemServer进程
2:fork 出来的子进程在handleSystemServerProcess里开始初始化工作
3~6:调用zygotelnit方法,重定向 log 输出,通用的初始化(设置默认异常捕捉方法,时区等);调用Native层的代码,主要用来启动Binder线程池,从而SystemServer进程就可以使用Binder 与其它进程进行通信;进入SystemServer的main方法
7~9:设置虚拟机的内存利用率参数值,继续调用invokeStaticMain方法并通过反射机制可以得到SystemServer类,并找到SystemServer中的 main方法,然后将找到的 main方法传入到MethodAndArgsCaller异常中并抛出该异常,而捕获MethodAndArgsCaller异常的代码在Zygotelnit.java的 main方法中,通过这个方法又会调用SystemServer的main方法。
11~15:运行SystemServer进程及关键流程

框架结构如下图所示:

在这里插入图片描述

SystemServer是由Zygote启动的它的源码路径为:
Frameworks/base/services/java/com/android/server/SystemServer.java
类名:
public final class SystemServer ,所以SystemServer这个类是不允许子类化的,即不能被其他类继承.

SystemServer是由Zygote进程启动,之后由SystemServer启动动了很多服务,并且将一些进程通过调用ServiceManager 的静态方法addService,将service放到ServiceManager。当App需要使用这些服务时可能调用ServiceManager的 getService方法获取到它们。

四、Zygote简介

zygote是Android系统创建新进程的核心进程,Zygote的主要作用准备好一些常用类,JNI函数,主题资源,共享库,同时也负责启动虚拟机、启动system_server进程,随后进入等待处理app应用请求。每个应用对应一个进程,它们都是由zygote进程创建出来的。
应用程序运行前,通过Zygote进程共享已运行的虚拟机代码与内存信息,缩短应用程序运行所耗费的时间。也就是说,Zygote进程会事先将应用程序要使用的Android Framework 中的类与资源加载到内存中,并组织形成所用资源的链接信息。这样,新运行的Android应用程序在使用所需资源时不必每次形成资源的链接信息,这样就大大提升了程序的运行时间。

在这里插入图片描述

五、SystemServer中启动服务

1.startBootstrapServices:引导服务

在这里插入图片描述

2.startCoreServices:核心服务

在这里插入图片描述

3.startOtherServices:其他服务

在这里插入图片描述

关键流程

在这里插入图片描述

Zygote进程启动:
1、系统Init进程启动Zygote进程,
2、Zygote进程启动ART、注册JNI,然后fork 出SystemsServer并启动它
3、SystemServer启动Boot服务、启动核心服务、启动其它服务

system_server进程启动:
1、启动Boot服务
2、启动核心服务
3、启动其它服务

补充说明----startCoreServices阶段:
启动服务BatteryService,需要LightService
启动服务UsageStatsService,统计应用使用情况
检查是否存在可更新的WebView。存在就启动服务WebViewUpdateService
启动服务BinderCallsStatsService,跟踪Binder调用的CPU时间消耗

六、启动阶段分析

启动服务的三个阶段中,SystemServiceManager的startBootPhase()贯穿system_server进程以及服务的整个启动过程;
启动阶段分类,定义在com.android.server.SystemServeive类中;

划分阶段的具体作用是什么呢?看一下startBootPhase()方法:

public void startBootPhase(final int phase){ 
    if (phase <= mCurrentPhase){
          throw new IllegalArgumentException("Next phase must be larger than
       previous");
    }
      mcurrentPhase = phase;
     try {
      final int serviceLen = mServices.size();
      for (int i = 0; i < serviceLen; i++){
      final SystemService service = mServices.get(i);
      long time = SystemClock.elapsedRealtime();
  try {
    //回调系统服务的 onBootPhase()方法
    service.onBootPhase( mcurrentPhase);
    }catch (Exception ex){
      throw new RuntimeException("Failed to boot service "
      +service.getclass().getName()
      +" : onBootPhase threw an exception during phase "
      +mCurrentPhase, ex);
  }
    warnIfTooLong(SystemClock.elapsedRealtime() - time, service,
"onBootPhase" );
  }
} finally{
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

核心在于service.onBootPhase(mCurrentPhase);
所有的系统服务都是继承于Systemservice的,
startBootPhase()方法会回调当前阶段已经加入mServices的所有服务系统的onBootPhase()方法,在合适的阶段做一些合适的事情
;

总结

下面对SystemServer做一下简单总结:
1.Zygote调用startSystemServer创建system_server进程
2.SS调用handleSystemServerProcess完成自己的使命
3.handleSystemServerProcess抛出异常,最终调用SystemServer的 main函数
4.main加载 libandroid_server.so并调用native_init方法
5.在后面的3个关键方法中,启动一些系统服务
startBootstrapServices();
startCoreServices();
startOtherServices();
6.进入消息循环,等待请求
另外,在 startOtherServices 的最后会调用AMS的onSystemReady()方法启动桌面Activity。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/227896
推荐阅读
相关标签
  

闽ICP备14008679号