Android 之 zygote 与进程创建
2012-01-31 10:58
435 查看
在android中,应用程序的入口是ActivityThead中的main函数,那么之后系统是怎样为应用程序创建进程的呢?SystemService又是怎样创建的?答案是:zygote
zygote翻译成中文是受精卵的意思,名字比较奇怪、但是很有意思。在android中,大部分的应用程序进程都是由zygote来创建的,为什么用大部分,因为还有一些进程比如系统引导进程、init进程等不是有zygote创建的。相反,zygote还是在init进程之后才被创建的。在android中提到zygote,主要两块,一个是C/C++编写的zygote,主要用来为应用和SystemService fork进程的。一个是java编写的zygote接口,负责为应用和service调用C/C++ zygote的接口执行fork,从而创建VM进程。说明:在android中,service主要有NativeService和SystemService。SystemService主要是指系统中service,比如,InputMethodService、ActivityManagerService等。
zygote在android中主要有两个作用:
建立运行时环境并启动虚拟机,执行com.android.internal.os.ZygoteInit的main函数,从而fork SystemService
[java]
view plaincopyprint?
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
startSystemServer()调用Zygote的native方法 forkSystemServer(); 到这里,java端的Zygote的准备工作就结束了,接下来就交给C/C++端的Zygote来执行fork任务了。来看下代码:
在 ../dalvik/vm/native/dalvik_system_Zygote.c 中
[java]
view plaincopyprint?
static void Dalvik_dalvik_system_Zygote_forkSystemServer(
const u4* args, JValue* pResult)
{
pid_t pid;
/*调用forkAndSpecializeCommon,执行fork */
pid = forkAndSpecializeCommon(args, true);
/* 检查fork后返回的进程pid */
if (pid > 0) {
int status;
LOGI("System server process %d has been created", pid);
gDvm.systemServerPid = pid;
if (waitpid(pid, &status, WNOHANG) == pid) {
LOGE("System server process %d has died. Restarting Zygote!", pid);
kill(getpid(), SIGKILL);
}
}
RETURN_INT(pid);
}
通过Process的start方法来创建进程。
[java]
view plaincopyprint?
/ **
*通过Zygote进程来创建新的vm进程
*/
public static final int start(final String processClass,final String niceName,int uid, int gid, int[] gids,int debugFlags,String[] zygoteArgs)
{
if (supportsProcesses()) {
try {
return startViaZygote(processClass, niceName, uid, gid, gids,
debugFlags, zygoteArgs); //argsForZygote.add("--runtime-init")初始化运行环境
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
throw new RuntimeException(
"Starting VM process through Zygote failed", ex);
}
} else {
// Running in single-process mode
Runnable runnable = new Runnable() {
public void run() {
Process.invokeStaticMain(processClass);
}
};
// Thread constructors must not be called with null names (see spec).
if (niceName != null) {
new Thread(runnable, niceName).start();
} else {
new Thread(runnable).start();
}
return 0;
}
}
调用Zygote的native方法forkAndSpecialize,执行进程的创建工作。本地方法的实现也是在 ../dalvik/vm/native/dalvik_system_Zygote.c 中,底层调用linux的fork。
[java]
view plaincopyprint?
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, parsedArgs.debugFlags, rlimits);
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, parsedArgs.debugFlags, rlimits);
这样应用程序的进程就创建起来了。从ActivityManagerService开始的时序图如下:
总结:
在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的fork方法创建SystemServer进程。
应用程序的进程也是由Zygote创建的,在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。
应用进程和服务进程位于不同的进程中,他们之间是通过IPC进行数据传递的。接下来一篇会介绍在android中的进程间通信机制:Binder
zygote翻译成中文是受精卵的意思,名字比较奇怪、但是很有意思。在android中,大部分的应用程序进程都是由zygote来创建的,为什么用大部分,因为还有一些进程比如系统引导进程、init进程等不是有zygote创建的。相反,zygote还是在init进程之后才被创建的。在android中提到zygote,主要两块,一个是C/C++编写的zygote,主要用来为应用和SystemService fork进程的。一个是java编写的zygote接口,负责为应用和service调用C/C++ zygote的接口执行fork,从而创建VM进程。说明:在android中,service主要有NativeService和SystemService。SystemService主要是指系统中service,比如,InputMethodService、ActivityManagerService等。
zygote在android中主要有两个作用:
建立运行时环境并启动虚拟机,执行com.android.internal.os.ZygoteInit的main函数,从而fork SystemService
[java]
view plaincopyprint?
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
[java] view plaincopyprint? registerZygoteSocket();//登记Listen端口 startSystemServer();//启动SystemServer registerZygoteSocket();//登记Listen端口 startSystemServer();//启动SystemServer
startSystemServer()调用Zygote的native方法 forkSystemServer(); 到这里,java端的Zygote的准备工作就结束了,接下来就交给C/C++端的Zygote来执行fork任务了。来看下代码:
在 ../dalvik/vm/native/dalvik_system_Zygote.c 中
[java]
view plaincopyprint?
static void Dalvik_dalvik_system_Zygote_forkSystemServer(
const u4* args, JValue* pResult)
{
pid_t pid;
/*调用forkAndSpecializeCommon,执行fork */
pid = forkAndSpecializeCommon(args, true);
/* 检查fork后返回的进程pid */
if (pid > 0) {
int status;
LOGI("System server process %d has been created", pid);
gDvm.systemServerPid = pid;
if (waitpid(pid, &status, WNOHANG) == pid) {
LOGE("System server process %d has died. Restarting Zygote!", pid);
kill(getpid(), SIGKILL);
}
}
RETURN_INT(pid);
}
[java] view plaincopyprint? int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null); int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null);
通过Process的start方法来创建进程。
[java]
view plaincopyprint?
/ **
*通过Zygote进程来创建新的vm进程
*/
public static final int start(final String processClass,final String niceName,int uid, int gid, int[] gids,int debugFlags,String[] zygoteArgs)
{
if (supportsProcesses()) {
try {
return startViaZygote(processClass, niceName, uid, gid, gids,
debugFlags, zygoteArgs); //argsForZygote.add("--runtime-init")初始化运行环境
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
throw new RuntimeException(
"Starting VM process through Zygote failed", ex);
}
} else {
// Running in single-process mode
Runnable runnable = new Runnable() {
public void run() {
Process.invokeStaticMain(processClass);
}
};
// Thread constructors must not be called with null names (see spec).
if (niceName != null) {
new Thread(runnable, niceName).start();
} else {
new Thread(runnable).start();
}
return 0;
}
}
[java] view plaincopyprint? try { args = readArgumentList(); descriptors = mSocket.getAncillaryFileDescriptors(); } catch (IOException ex) { Log.w(TAG, "IOException on command socket " + ex.getMessage()); closeSocket(); return true; } try { args = readArgumentList(); descriptors = mSocket.getAncillaryFileDescriptors(); } catch (IOException ex) { Log.w(TAG, "IOException on command socket " + ex.getMessage()); closeSocket(); return true; }
调用Zygote的native方法forkAndSpecialize,执行进程的创建工作。本地方法的实现也是在 ../dalvik/vm/native/dalvik_system_Zygote.c 中,底层调用linux的fork。
[java]
view plaincopyprint?
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, parsedArgs.debugFlags, rlimits);
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, parsedArgs.debugFlags, rlimits);
这样应用程序的进程就创建起来了。从ActivityManagerService开始的时序图如下:
总结:
在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的fork方法创建SystemServer进程。
应用程序的进程也是由Zygote创建的,在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。
应用进程和服务进程位于不同的进程中,他们之间是通过IPC进行数据传递的。接下来一篇会介绍在android中的进程间通信机制:Binder
相关文章推荐
- Android 之 zygote 与进程创建
- Android 之 zygote 与进程创建
- Android 之 zygote 与进程创建
- Android zygote与进程创建(二)
- Android 之 zygote 与进程创建
- Android zygote与进程创建(一)
- Android 之 zygote 与进程创建
- Android zygote与进程创建(二)
- Android入门进阶教程(15)-进程创建zygote 详解
- Android 之 zygote 与进程创建
- Android 之 zygote 与进程创建
- 4.1Android进程启动原理分析----Zygote
- android N进程启动流程(二)(上一个activity的暂停、进程启动、绑定进程与创建application)
- Android 6.0 AMS分析的第二条线:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互等知识;
- Android系统源码阅读(14):Zygote和System进程的启动
- 理解Android进程创建流程(转)
- Android情景分析之详解init进程(以启动zygote为例)
- Android系统进程Zygote启动过程的源代码分析
- Android系统进程Zygote启动流程
- Android系统进程Zygote启动过程的源代码分析