上一篇分析了Zygote进程启动过程,了解到Zygote进程启动了 SyetemServer 进程,接下来开始学习SyetemServer进程的启动过程。
Zygote 启动 SystemServer
ZygoteInit 在 main 函数中通过调用 startSystemServer 函数启动 SystemServer进程。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
|
|
代码可知实际上是调用了 handleSystemServerProcess 来启动 SystemServer进程。
SystemServer 启动过程
|
|
handleSystemServerProcess函数的主要工作是:
- 关闭从zygote继承下来的socket
- 利用systemServerClass对应的路径构建对应的ClassLoader
- 调用RuntimeInit.zygoteInit函数将剩余参数传递到SystemServer.
接下来进入到 RuntimeInit.zygoteInit函数
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
|
|
nativeZygoteInit()
nativeZygoteInit 很明显是一个 native 函数,它的实现在 frameworks/base/core/jni/AndroidRuntime.cpp 中,下面来看下它的实现,只有一行代码就是 gCurRuntime 调用 onZygoteInit 函数,gCurRuntime 指向AndroidRuntime 对象。
|
|
由于SystemServer进程由zygote进程fork出来,于是system server进程中也存在gCurRuntime对象,类型为AppRuntime。至此我们知道,Native函数中gCurRuntime->onZygoteInit将调用AppRuntime中的onZygoteInit。
frameworks/base/cmds/app_process/app_main.cpp
|
|
applicationInit
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
|
|
applicationInit 函数主要通过调用 invokeStaticMain 函数来实现。
|
|
invokeStaticMain 函数的主要作用:
- 根据类名创建一个类,实际上是 SystemServer 类。
- 找到 SystemServer 类的 mian 方法。
- 将 main 方法传入到 MethodAndArgsCaller 异常中并抛出异常。
那么这个抛出的异常 MethodAndArgsCaller 在哪里捕获呢?注释已经提示在 ZygoteInit.java的main函数 中。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
|
|
捕获 MethodAndArgsCaller 异常后调用 MethodAndArgsCaller 的run ff。
|
|
run 方法利用反射调用对应类的 main 方法,这里是 SystemServer.java 的 main 方法。
这里的问题是,为什么不在RuntimeInit.java的invokeStaticMain中,直接利用反射调用每个类的main方法?
参考invokeStaticMain中抛出异常的注释,注意到,我们此时运行在SystemServer进程中。由于zygote进程fork的原因,SystemServer调用到invokeStaticMain时,整个堆栈实际上包含了大量zygote进程复制过来的调用信息。此时,我们通过抛异常捕获的方式,让位于栈底的ZygoteInit.main函数来进行处理,可起到刷新整个调用栈的作用(旧的无用调用出栈)。
SystemServer 工作过程
frameworks/base/services/java/com/android/server/SystemServer.java
|
|
SystemServer 的 main 方法直接创建一个 SystemServer 对象,并调用其 run 方法。
|
|
run 方法的主要作用:
- 设置主线程的优先级
- 初始化SystemServer的looper
- 加载 native 库文件
- 初始化系统环境变量 mSystemContext
- 创建SystemServiceManager,用于创建和管理系统服务
- 启动各种系统服务
- 启动 Looper。
至此 SystemServer 的启动及工作过程就完成了。
下图列出了部分系统服务以及它们的作用:
下面介绍一下SystemServiceManager启动系统服务的简要过程,以PowerManagerService启动为例:
|
|
SystemServiceManager 的 startService 函数如下所示。
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
|
|
- 1.创建SystemService
- 2.将SystemService添加到mServices中,mServices是一个存储SystemService类型的集合
- 3.调用onstart启动服务,并返回服务。