SystemServer 是 Android JAVA 层的系统服务模块,这个模块主要功能就是管理供 Android 应用开发的 system service.
1.SystemServer 类是如何启动的
让我们从 Android 的启动过程看起,查看 init.rc 文件,就会发现下面这一行
service zygote /system/bin/app_process -Xzygote /system/bin --zygote –start-system-server
我们知道 zygote 进程是整个 Android 的孵化器进程,所有的 Activity 进程均是通过它来生成的。我们发现在 zygote 进程启动过程中指定了这么一个参数“– start-system-server” ,这个参数就是在 zygote 进程启动的同时启动 SystemServer 。
那么 SystemServer 是以什么样的形式启动的呢?是单独的一个进程还是线程,分析一下 zygote 进程的启动过程就明白了。在 Android 中 zygote 进程启动其实就是启动 /system/bin/app_process 这个进程,这个进程的源代码在 frameworks/base/cmds/app_process/app_main.cpp 中。
由于 zygote 进程启动过程有“ --zygote” 这个参数,所以走的是下面这步
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
查看对象 runtime 的类型的定义,
class AppRuntime : public AndroidRuntime
因此查看 AndroidRuntime 的 start 方法中的一段代码 (frameworks/base/core/jni/AndroidRuntime.cpp)
其中 startClass 即为 "com.android.internal.os.ZygoteInit" ,这段代码调用了 com.android.internal.os.ZygoteInit 的 main 函数。
那么再往下看 ZygoteInit 类的 main 函数,其中的一段 MethodAndArgsCaller 代码为
调用了 startSystemServer () ,这个函数启动了一个子进程来作为 SystemServer 的载体,
1. 它首先指定 SystemServer 进程的参数 ;
2. 根据指定的参数来创建 SystemServer 进程;
3. 调用 handleSystemServerProcess 启动第一步指定进程参数过程中指定的类,此时为“ com.android.server.SystemServer ” ,启动的这个进程在 ps 查看后显示为” system_server ” 。
通过以上过程就会调用到 SystemServer 类,且是运行在一个名为“ system_server” 的进程中,这个进程为 zygote 的子进程。
虽然 SystemServer 类是运行在 system_server 中的,但是它并不运行在 system_server 的主线程中。
上代码
由代码可以看出,在调用函数 invokeStaticMain 的最后会抛出一个异常。
回过头再看一下 ZygoteInit 类的 main 函数中的一段代码
其实就是在这个抛出的异常中启动了 SystemServer 类,且这个异常为一个 Runnable 类型,因此 SystemServer 类就运行在 system_server 进程中的一个新的线程里。
2.SystemServer 执行内容
1. 执行 frameworks/base/cmds/system_server/library/system_init.cpp 中的 system_init 函数,启动当前进程,也就是进程 system_server 的 pool thread ,以便执行 Binder IPC 操作。
2. 向 SM(Service Manager) 添加系统服务。