本文将介绍有关Android System Server相关的一些知识。
系统版本: Ubuntu 22.04 lts
AOSP分支: android-14.0.0_r28
在阅读本篇建议先阅读:
Zygote
juejin.cn/post/734457...
Linuxfork
概念
本篇依旧会只展示关键代码,所以最好打开AOSP源码一步步的跟着看,才能理解整个的流程。
什么是System Server
在Android的应用层开发中,我们会使用到一系列的service,比如ActivityManagerService
,PowerManagerService
等,System Server的作用,就是去启动这些Service。
System Server进程启动分析
我们的System Server是从Zygote进程中fork
出来的,下面,我就将一步步讲解Zygote启动System Server的整个流程。
首先,我们打开/frameworks/base/core/java/com/android/internal/os/ZygoteInit
,找到它的main
方法,然后可以找到如下代码:

这里,就是我们System Server启动的关键部分,从代码中我们可以得知,只有startSystemServer
这个变量为true
的时候,执行我们启动System Server的逻辑,在往上,我们可以看到:

这个变量的值,是由外部参数决定的,这个参数其实在我们的Zygote启动的时候,就已经传进来了,可以打开/system/core/rootdir/init.zygote64.rc
,可以看到对应的参数:

那么forkSystemServer
这个方法究竟是做什么的,其实从名字上就可以判断出来,这个方法就是从Zygote去fork
出我们的System Server的进程的。
首先进入这个方法,其它的先不管,找到这段代码:

再进入Zygote
类的forkSystemServer
方法:

就可以看到实际上我们是通过Native层去fork
我们的进程的,打开/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
,找到com_android_internal_os_Zygote_nativeForkSystemServer
,这就是我们的Native层的实际调用。
然后在这个方法里面,我们可以看到它调用了zygote
的ForkCommon
方法:

再进入这个方法,在中间我们就可以找到fork
的调用了:

到这一步,其实我们的System Server进程就已经fork
出来了,但问题是目前这个进程还没有我们System Server相关的内容,那么接下来,我们就要开始真正启动我们的System Server了。
System Server! 启动!
打开/frameworks/base/core/java/com/android/internal/os/ZygoteInit
,继续看它的forkSystemServer
方法,首先我们看这一部分:

从注释里面我们也能看出来,这是System Server的启动参数,比如--nice-name=system_server
,这个其实就是进程名,com.android.server.SystemServer
,其实就是我们的启动类了。
再往下看,可以看到这部分代码:

从刚才我们就已经知道,Zygote.forkSystemServer
,是帮我们fork
进程的,那么下面这段代码,只有子进程,也就是我们刚刚fork
出来的System Server才会执行,如果不明白这部分逻辑的,可以看下开头的fork
相关概念。
那我们看下这段代码,首先,System Server进程做了一个判断,如果有32位的Secondary Zygote,那么就等待,等待Secondary Zygote启动之后再进行下一步,接着,就关闭了本进程的zygoteServer
,因为被fork
出来的System Server子进程不需要通过LocalSocket
来fork
应用进程,再然后,会调用handleSystemServerProcess
这个方法:

然后我们直接看这段代码,然后再依次进入ZygoteInit.zygoteInit
,RuntimeInit.applicationInit
,findStaticMain
:




最后,在findStaticMain
中,找到这部分代码:

可以看到,这就是我们最终返回的Runnable
了,那么这个类主要是做什么的呢? 其实就是执行我们传给他的startClass
的main
方法:

最后这个Runnable
的执行,可以在/frameworks/base/core/java/com/android/internal/os/ZygoteInit
的main
方法里面,forkSystemServer
调用的后面找到:

在注释里我们也可以看到,这部分代码是由system_server
,也就是Zygotefork
出来的System Server进程,去执行的。
那么接下来,我们就要看看我们的com.android.server.SystemServer
的main
方法,看看它到底做了什么。
System Server启动其它服务
打开/frameworks/base/services/java/com/android/server/SystemServer.java
,找到它的main
方法,可以看到他就是调用了自己这个类的run
:

我们再进入run
方法:

找到如下的代码块:

这里,就可以看到我们启动服务的地方了,可以看到,服务被分为了4类:BootstrapServices
,CoreServices
,OtherServices
和ApexServices
,比如我们熟悉的ActivityManagerService
,他就被放在了startBootstrapServices
中启动。
然后我们回到刚才run
方法的最后,可以看到在这里,System Server进入了loop状态,而所有的这些Service就都会运行在system_server
这个进程里面了。

打开adb shell,输入ps -A | grep system_server
,就可以看到我们的System Server进程了:

到这里,我们就完成了整个System Server的启动分析,和它启动其它Service的分析,那么接下来,我们就要去看看,我们的Launcher是如何启动的了。