上述函数将创建进程的参数放入argsForZygote列表中。例如参数“--runtime-init”表示为新创建的进程初始化运行时库,然后调用zygoteSendAndGetPid函数进行进一步的操作。Step4.函数Process.zygoteSendAndGetPid定义在frameworks/base/core/java/android/os/Process.java文件中: throwsZygoteStartFailedEx{ intpid; openZygoteSocketIfNeeded(); try{ /** *Seecom.android.internal.os.ZygoteInit.readArgumentList() processistolythe*Present: *a)参数计数(argc,nessence) *b)一些换行符分隔的参数字符串sequaltocount * *在合子进程读取之后,它将写出 *孩子或1失败时的pid。Integer.toString(args.size()); sZygoteWriter.newLine(); intsz=args.size(); for(inti=0;i=0){ thrownewZygoteStartFailedEx( "embeddednewlinesnotallowed"); } sZygoteWriter.write(arg); sZygoteWriter.newLine(); } sZygoteWriter.flush(); //应该有时间吗?pid=sZygoteInputStream.readInt(); if(pid<0){ thrownewZygoteStartFailedEx("fork()failed"); } }catch(IOExceptionex){ ...... } returnpid; } ...... } 这里的sZygoteWriter是一个Socket写入流,是由openZygoteSocketIfNeeded函数打开的: [java]viewplaincopypublicclassProcess{ ...... /** *TriestoopensockettoZygoteprocessifnotalreadyopen.If *alreadyopen,doesnothing.Mayblockandretry. */donSocketIfnotalreadyopen) throwsZygoteStartFailedEx{ intretryCount; if(sPreviousZygoteOpenFailed){ /* *如果我们之前失败了,预计我们会再次失败并且 *不要暂停重试/?。retryCount=0; }else{ retryCount=10; } /* *Seebug#811181:Sometimessruntimecanmakeitupbeforezygote. *真的,我们想做一些事情更好的避免这种情况,*butfornowjustwaitabit... */ for(intretry=0 ;(sZygoteSocket==null)&&(retry<(retryCount+1)) ;retry++){ if(重试>0){ try{ Log.i("Zygote","Zygotenotupyet,sleeping..."); Thread.sleep(ZYGOTE_RETRY_MILLIS); }catch(InterruptedExceptionex){ //不应该发生 } } 试试{ sZygoteSocket=newLocalSocket(); sZygoteSocket.connect(newLocalSocketAddress(ZYGOTE_SOCKET, LocalSocketAddress.Namespace).RESERVED); sZygoteInputStream =newDataInputStream(sZygoteSocket.getInputStream()); sZygoteWriter= newBufferedWriter( newOutputStreamWriter( sZygoteSocket.getOutputStream()),2);Log.i("Zygote","Process:zygotesocketopened"); sPreviousZygoteOpenFailed=false; break; }catch(IOExceptionex){ ...... } } …… } …… }这个Socket由frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中的ZygoteInit类在runSelectLoopMode函数中调用的。