玩转Android Framework:System Server

本文将介绍有关Android System Server相关的一些知识。

系统版本: Ubuntu 22.04 lts

AOSP分支: android-14.0.0_r28

在阅读本篇建议先阅读:

Zygote

juejin.cn/post/734457...
Linux fork概念

juejin.cn/post/691261...

本篇依旧会只展示关键代码,所以最好打开AOSP源码一步步的跟着看,才能理解整个的流程。

什么是System Server

在Android的应用层开发中,我们会使用到一系列的service,比如ActivityManagerServicePowerManagerService等,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层的实际调用。

然后在这个方法里面,我们可以看到它调用了zygoteForkCommon方法:

再进入这个方法,在中间我们就可以找到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子进程不需要通过LocalSocketfork应用进程,再然后,会调用handleSystemServerProcess这个方法:

然后我们直接看这段代码,然后再依次进入ZygoteInit.zygoteInitRuntimeInit.applicationInitfindStaticMain:

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

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

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

在注释里我们也可以看到,这部分代码是由system_server,也就是Zygotefork出来的System Server进程,去执行的。

那么接下来,我们就要看看我们的com.android.server.SystemServermain方法,看看它到底做了什么。

System Server启动其它服务

打开/frameworks/base/services/java/com/android/server/SystemServer.java,找到它的main方法,可以看到他就是调用了自己这个类的run:

我们再进入run方法:

找到如下的代码块:

这里,就可以看到我们启动服务的地方了,可以看到,服务被分为了4类:BootstrapServicesCoreServicesOtherServicesApexServices,比如我们熟悉的ActivityManagerService,他就被放在了startBootstrapServices中启动。

然后我们回到刚才run方法的最后,可以看到在这里,System Server进入了loop状态,而所有的这些Service就都会运行在system_server这个进程里面了。

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

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

相关推荐
努力学习的小廉11 分钟前
深入了解linux系统—— System V之消息队列和信号量
android·linux·开发语言
程序员江同学1 小时前
Kotlin/Native 编译流程浅析
android·kotlin
移动开发者1号2 小时前
Kotlin协程与响应式编程深度对比
android·kotlin
花花鱼11 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
alexhilton12 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
AirDroid_cn16 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
尊治16 小时前
手机电工仿真软件更新了
android
xiangzhihong819 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios
车载应用猿19 小时前
基于Android14的CarService 启动流程分析
android