Jimmy Chen

A Programmer

(原创)Android SystemServer分析

一.Zygote到SystemServer

  SystemServer是由Zygote fork生成的,进程名为system_server,这个进程包含里framework中的核心服务,在Zygote的分析中有提到,SystemServer是在zygote中通过startSystemServer来调用起来

1.1 ZygoteInit.java中的startSystemServer函数

1.2 Zygote.java中的forSystemServer函数

  nativeForkSystemServer会通过JNI调用com_android_internal_os_Zygote.cpp中的com_
android_internal_os_Zygote_nativeForkSystemServer方法。

1.3 Com_android_internal_os_Zygote.cpp中com_internal_os_Zygote_nativeForkSystemServer方法

  当system_server进程创建失败时,将会重启zygote进程。这里需要注意,对于Android 5.0以上系统,有两个zygote进程,分别是zygote、zygote64两个进程,system_server的父进程,一般来说64位系统其父进程是zygote64进程。

  1. 当kill system_server进程后,只重启zygote64和system_server,不重启zygote;
  2. 当kill zygote64进程后,只重启zygote64和system_server,也不重启zygote;
  3. 当kill zygote进程,则重启zygote、zygote64以及system_server。

1.4 com_android_internal_os_Zygote.cpp中ForkAndSpecializeCommon函数

  这个函数有点复杂,设置处理信号这边大家还是看原生注释吧,有些地方我这边也不是看得特别明白。

  至此,fork的工作就基本做完了,剩下的就是在handleSystemServerProcess中对SystemServer的剩余工作进行处理了。

1.5 ZygoteInit.java中的handleSystemServerProcess函数

1.6 ZygoteInit.java中的performSystemServerDexOpt函数

1.7 RuntimeInit.java中的ZygoteInit函数

1.8 RuntimeInit.java中的commonInit函数

1.9 AndroidRuntime.cpp中的com_android_internal_os_RuntimeInit_nativeZygoteInit方法

  onZygote的代码在app_main.cpp中,代码如下:

1.10 RuntimeInit.java中的applicationInit方法

1.11 RuntimeInit.java中的invokeStaticMain方法

  上面的函数调用最后是通过抛出ZygoteInit.MethodAndArgsCaller异常的方法,将方法的调用栈返回到ZygoteInit.main()函数中,下面我们在重新看看ZygoteInit的main函数是怎么处理这个异常的。

1.12 ZygoteInit.java中的main函数

1.13 ZygoteInit.java中的MethodAndArgsCaller类

2. SystemServer的实际内容

  第一部分介绍到Zygote最后会执行com.android.server.Systemserver的main函数,那程序就会直接跳转到main函数。

2.1 SystemServer.java中的main函数

2.2 SystemServer.java中的run函数

2.3 SystemServer.java中的performPendingShutdown函数

2.4 SystemServer.java中的createSystemcontext函数

2.5 SystemServer.java中的startBootstrapServices函数

2.6 SystemServer.java中的startCoreServices函数

2.7 其余Service

  最后就是通过SystemServer.java中的startOtherService方法启动的service了,因为start OtherService这个方法里面启动的service比较多,例如:AudioService、CameraService、AccountService等,而且方法内容长,所以就不贴出来了,各位有兴趣可以自己去看,后续如果有分析到具体的某一个service,到时候再拿出来看就好了。

2.8 小总结

  从代码中可以看到,System_server启动service的方法主要是通过两种方式:一种是通过SystemServiceManager的startService(),这个方法主要是用来启动继承于SystemService的服务。主要过程为,首先创建serviceClass类的对象,然后将刚刚创建的serviceClass类对象添加到SystemServiceManager的成员对象mServices(是一个Arraylist),然后再调用刚创建对象的onStart方法。对于那些启动到一定阶段的服务,进入到相应阶段的Phase后,还会调用到SystemServiceManager的startBootPhase()回掉方法,这个方法会循环遍历所有向SystemServiceManager注册过的service的onBootPhase()方法;另外一种就是通过ServiceManager的addService(String name, IBinder service),该方法用于初始化继承于IBinder的服务。

  启动过程中各个Phase所代表的阶段如下:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注