4.4 zygote的分裂

前文已经讲到,zygote分裂出嫡长子system_server后,就通过runSelectLoopMode等待并处理来自客户的消息了,那么,谁会向zygote发送消息呢?这里以一个Activity的启动为例,具体分析zygote是如何分裂和繁殖的。

4.4.1 ActivityManagerService发送请求

ActivityManagerService也是由SystemServer创建的。假设通过startActivity来启动一个新的Activity,而这个Activity附属于一个还未启动的进程,那么这个进程该如何启动呢?先来看看ActivityManagerService中的startProcessLocked函数,代码如下所示:


[—>ActivityManagerService.java]

private final void startProcessLocked(ProcessRecord app,

String hostingType,String hostingNameStr){

……//这个ActivityManagerService类很复杂,有14657行!

if("1".equals(SystemProperties.get("debug.checkjni"))){

debugFlags|=Zygote.DEBUG_ENABLE_CHECKJNI;

}

if("1".equals(SystemProperties.get("debug.assert"))){

debugFlags|=Zygote.DEBUG_ENABLE_ASSERT;

}

//这个Process类是Android提供的,并非JDK中的Process类。

int pid=Process.start("android.app.ActivityThread",

mSimpleProcessManagement?app.processName:null,uid,uid,

gids,debugFlags,null);

……

}


接着来看看Process的start函数,这个Process类是android.os.Process,它的代码在Process.java中,代码如下所示:


[—>Process.java]

public static final int start(final String processClass,final String niceName,

int uid,int gid,int[]gids,int debugFlags,String[]zygoteArgs)

{

//注意,processClass的值是"android.app.ActivityThread"。

if(supportsProcesses()){

try{

//调用startViaZygote。

return startViaZygote(processClass,niceName,uid,gid,gids,

debugFlags,zygoteArgs);

}

}

}

[—>Process.java:startViaZygote()]

private static int startViaZygote(final String processClass,

final String niceName,final int uid,final int gid,final int[]gids,

int debugFlags,String[]extraArgs)throws ZygoteStartFailedEx{

int pid;

……//一些参数处理,最后调用zygoteSendArgsAndGetPid函数。

argsForZygote.add("—runtime-init");//这个参数很重要。

argsForZygote.add("—setuid="+uid);

argsForZygote.add("—setgid="+gid);

pid=zygoteSendArgsAndGetPid(argsForZygote);

return pid;

}

[—>Process.java:zygoteSendArgsAndGetPid()]

private static int zygoteSendArgsAndGetPid(ArrayList<String>args)

throws ZygoteStartFailedEx{

int pid;

//openZygoteSocketIfNeeded?是不是打开了和Zygote通信的Socket?

openZygoteSocketIfNeeded();

try{

//把请求的参数发到Zygote。

sZygoteWriter.write(Integer.toString(args.size()));

sZygoteWriter.newLine();

sZygoteWriter.write(arg);

sZygoteWriter.newLine();

}

//读取Zygote处理完的结果,便可得知是某个进程的pid!

sZygoteWriter.flush();

pid=sZygoteInputStream.readInt();

return pid;

}

[—>Process.java]

private static void openZygoteSocketIfNeeded()throws ZygoteStartFailedEx{

try{

sZygoteSocket=new LocalSocket();//果真如此!

//连接Zygote。

sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET,

LocalSocketAddress.Namespace.RESERVED));

sZygoteInputStream

=new DataInputStream(sZygoteSocket.getInputStream());

sZygoteWriter=new BufferedWriter(

new OutputStreamWriter(

sZygoteSocket.getOutputStream()),256);

}

}

}

}


好了,ActivityManagerService终于向zygote发送请求了。请求的参数中有一个字符串,它的值是“android.app.ActivityThread”。现在该回到zygote处理请求那块去看看了。

注意 由于ActivityManagerService驻留于SystemServer进程中,所以正是SS向Zygote发送了消息。