当前位置: 首页 > 科技观察

Android应用进程启动过程源码分析(四)

时间:2023-03-22 11:55:03 科技观察

上述函数将创建进程的参数放入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函数中调用的。