赞
踩
SystemServer就是系统用来启动service的入口。
Android系统在启动的时候,在启动两个重要的进程,一个是Zygote进程
另一个是由zygote进程fork出来的system_server进程;
SystemServer会启动我们在系统中所需要的一系列service
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是Android系统创建新进程的核心进程,Zygote的主要作用准备好一些常用类,JNI函数,主题资源,共享库,同时也负责启动虚拟机、启动system_server进程,随后进入等待处理app应用请求。每个应用对应一个进程,它们都是由zygote进程创建出来的。
应用程序运行前,通过Zygote进程共享已运行的虚拟机代码与内存信息,缩短应用程序运行所耗费的时间。也就是说,Zygote进程会事先将应用程序要使用的Android Framework 中的类与资源加载到内存中,并组织形成所用资源的链接信息。这样,新运行的Android应用程序在使用所需资源时不必每次形成资源的链接信息,这样就大大提升了程序的运行时间。
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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。