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);
  }
}

核心在于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。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemServerAndroid 系统启动过程中的关键组件之一,它负责启动和管理系统中的各种服务和进程。SystemServer 的主要功能如下: 1. 启动 Android 系统中的各种系统服务,如 ActivityManagerService、PackageManagerService、WindowManagerService 等; 2. 初始化和启动 Zygote 进程,该进程将作为应用程序进程的父进程; 3. 启动系统中的各种进程,如系统进程、系统应用进程等; 4. 加载和初始化 Android 系统的各种服务和组件。 下面是 SystemServer 的源码解析: 1. SystemServer 的入口 SystemServer 的入口在 frameworks/base/services/java/com/android/server/SystemServer.java 文件中。在该文件中,SystemServer 类继承了 Binder 和 Runnable 接口,并且实现了 Runnable 接口的 run() 方法,该方法是 SystemServer 的入口。 在 run() 方法中,SystemServer 执行了以下操作: 1.1. 初始化 SystemServer 的环境 SystemServer 首先初始化自己的环境,包括设置系统属性、设置线程优先级等。 1.2. 启动各种系统服务 SystemServer 启动 Android 系统中的各种系统服务,包括 ActivityManagerService、PackageManagerService、WindowManagerService 等。这些服务都是在 SystemServer 的构造方法中创建的。 1.3. 初始化和启动 Zygote 进程 SystemServer 初始化和启动 Zygote 进程,该进程将作为应用程序进程的父进程。具体而言,SystemServer 调用 Zygote 的 main() 方法启动 Zygote 进程,并且设置 Zygote 的命令行参数。 1.4. 启动系统中的各种进程 SystemServer 启动 Android 系统中的各种进程,包括系统进程、系统应用进程等。具体而言,SystemServer 调用 ActivityManagerService 的 startSystemServer() 方法启动系统进程,并且调用 PackageManagerService 的 scanDirTracedLI() 方法扫描系统应用。 1.5. 加载和初始化 Android 系统的各种服务和组件 SystemServer 加载和初始化 Android 系统的各种服务和组件,包括 SystemUI、Launcher、InputMethodService 等。具体而言,SystemServer 调用 ActivityManagerService 的 startHomeActivity() 方法启动 Launcher,并且调用 PackageManagerService 的 packageInstalled() 方法加载和初始化应用程序。 2. SystemServer 的启动流程 SystemServer 的启动流程如下: 2.1. 启动 init 进程 在 Android 系统启动过程中,init 进程是第一个进程。init 进程启动时,会执行 init.rc 脚本中的命令,并且启动 SystemServer 进程。 2.2. 创建 SystemServer 进程 SystemServer 进程是在 init.rc 脚本中通过 service 命令创建的。具体而言,init.rc 脚本中会执行以下命令: ``` service system_server /system/bin/app_process -Xbootclasspath:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/core-junit.jar -classpath /system/framework/services.jar com.android.server.SystemServer ``` 该命令会启动 SystemServer 进程,并且设置 SystemServer 的启动参数。 2.3. 执行 SystemServer 的 run() 方法 当 SystemServer 进程启动后,会执行 SystemServer 的 run() 方法。在 run() 方法中,SystemServer 完成了 Android 系统的初始化和启动过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值