您的位置:首页 > 编程语言 > Go语言

zygote-->system_server

2012-06-06 12:44 357 查看
init进程通过init.rc中 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

创建一个名叫zygote的新进程(源码目录为frameworks/base/cmds/app_process/app_main.cpp), zygote进程主要调用如下代码

zygote:

//创建Java Runtime

AndroidRuntime::start("com.android.internal.os.ZygoteInit", "start-system-server");

-->startVm //start the virtual machine

-->startReg //Register native function

-->ZygoteInit.main //这里是通过env->CallStaticVoidMethod(startClass, startMeth, strArray)来间接调用的

-->registerZyogteSocket()// Registers a server socket for zygote command connections

-->startSystemServer() //创建一个名叫system_server的系统服务进程

-->Zygote.forkSystemServer() /* Request to fork the system server process , use underlay's fork() to create a new process */

/*等待其它进程发出命令请求

-->if (ZYGOTE_FORK_MODE) {

runForkMode();

--> while (true) {

pid = Zygote.fork(); /* 创建一个新进程来服务客户端的请求 */

}

} else {

runSelectLoopMode();

--> while (true) {

}

}

system_server进程:

当zygote进程通过调用Zygote.forkSystemServer()创建system_server进程后,system_server进程主要调用的代码为

handleSystemServerProcess() //ZygoteInit.java

-->RuntimeInit.zygoteInit()

-->applicationInit()

-->invokeStaticMain(args.startClass, args.startArgs) /* args.startClass ="com.android.server.SystemServer", 这个参数的值是在startSystemServer()函数里定义的参数 */

-->SystemServer.main() //SystemServer.java

-->SystemServer.init1() /*本地方法,本地实现文件为com_android_server_SystemServer.cpp*/

-->system_init() //system_init.cpp

-->回调SystemServer.init2()

-->new ServerThread("android.server.ServerThread) //创建一个线程来初始化系统的各种服务

-->run() {

//建立一系列的service

eg:Slog.i(TAG, "Power Manager");

power = new PowerManagerService();

ServiceManager.addService(Context.POWER_SERVICE,power);

....

Slog.i(TAG, "Window Manager");

wm = WindowManagerService.main(context, power,

factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,!firstBoot);

ServiceManager.addService(Context.WINDOW_SERVICE, wm);

....

}

/* 循环闭合管理框架 */

-->ProcessState::self()->startThreadPool();

-->IPCThreadState::self()->joinThreadPool();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: