android启动--深入理解zygote 2
上一节http://www.zzzyk.com/kf/201203/123062.html 说到 使用 Zygote.forkSystemServer 利用 fork 生成 SystemServer进程,那个这个进程到底干了哪些事情呢?
下面从 handleSystemServerProcess 处理流程开始讲解
代码片段如下:
/* Request to fork the system server process */
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, null);
/* For child process */
if (pid == 0) {
handleSystemServerProcess(parsedArgs);
}
-->
private static void handleSystemServerProcess(
ZygoteConnection.Arguments parsedArgs)
{
// 关闭哪些从 Zygote 继承来的 socket
closeServerSocket();
// 这里调用到 zygoteInit函数
RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
}
RuntimeInit.java @ frameworks\base\core\java\com\android\internal\os
public static final void zygoteInit(String[] argv){
// 这里调用到 JNI 函数中去了
zygoteInitNative();
// 调用到startClass com.android.server.SystemServer 的main函数
invokeStaticMain(startClass, startArgs);
}
-->
zygoteInitNative @ frameworks\base\core\jni
调用到 onZygoteInit @frameworks\base\cmds\app_process\app_main.cpp
virtual void onZygoteInit()
{
sp<ProcessState> proc = ProcessState::self();
if (proc->supportsProcesses()) {
LOGV("App process: starting thread pool.\n");
proc->startThreadPool(); // 启动线程,建立 binder 通讯
}
}
ok, 这个流程清楚了,下面我们重点看看 native system_server进程如何启动?
Main @ frameworks\base\services\java\com\android\server\SystemServer.java
public static void main(String[] args) {
System.loadLibrary("android_servers");
init1(args);
}
这里 init1 是个 native 函数:
system_init @ frameworks\base\cmds\system_server\library\system_init.cpp
extern "C" status_t system_init()
{
LOGI("Entered system_init()");
// Start the Su易做图ceFlinger
Su易做图ceFlinger::instantiate();
runtime->callStatic("com/android/server/SystemServer", "init2");
...
}
这里又调用到
init2 @ frameworks\base\services\java\com\android\server\SystemServer.java
public static final void init2() {
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
这里启动了一个 ServerThread 线程并调用其start() 函数,其实也就是调用
ServerThread 线程的 run() 函数
public void run() {
Slog.i(TAG, "Entropy Service");
ServiceManager.addService("entropy", new EntropyService());
Slog.i(TAG, "Power Manager");
power = new PowerManagerService();
ServiceManager.addService(Context.POWER_SERVICE, power);
...
// 最后进入到 loop 消息循环中处理消息了。。。。
Looper.loop();
Slog.d(TAG, "System ServerThread is exiting!");
}
Oh , 原来就是在就里将很多重要的系统服务依次加入到ServiecManager中,至此整个 SystemServer 进程启动完成。
总结一下,重要执行过程如下:
摘自 andyhuabing的专栏
补充:移动开发 , Android ,