4.4.2 有求必应之响应请求

前面有一节,题目叫“有求必应之等待请求”,那么这一节“有求必应之响应请求”会回到ZygoteInit中。下面就看看它是如何处理请求的。


[—->ZygoteInit.java]

private static void runSelectLoopMode()throws MethodAndArgsCaller{

……

try{

fdArray=fds.toArray(fdArray);

……

else if(index==0){

ZygoteConnection newPeer=acceptCommandPeer();

peers.add(newPeer);

fds.add(newPeer.getFileDesciptor());

}else{

boolean done;

//调用ZygoteConnection的runOnce。

done=peers.get(index).runOnce();

}

……

}


每当有请求数据发来时,zygote就会调用ZygoteConnection的runOnce函数。ZygoteConnection代码在ZygoteConnection.java文件中,来看看它的runOnce函数:


[—>ZygoteConnection.java]

boolean runOnce()throws ZygoteInit.MethodAndArgsCaller{

try{

args=readArgumentList();//读取SS发送过来的参数。

descriptors=mSocket.getAncillaryFileDescriptors();

}

……

int pid;

try{

parsedArgs=new Arguments(args);

applyUidSecurityPolicy(parsedArgs,peer);

//根据函数名,可知Zygote又分裂出了一个子进程。

pid=Zygote.forkAndSpecialize(parsedArgs.uid,parsedArgs.gid,

parsedArgs.gids,parsedArgs.debugFlags,rlimits);

}

……

if(pid==0){

//子进程处理,这个子进程是不是我们要创建的Activity对应的子进程呢?

handleChildProc(parsedArgs,descriptors,newStderr);

return true;

}else{

//zygote进程

return handleParentProc(pid,descriptors,parsedArgs);

}

}


接下来,看看新创建的子进程在handleChildProc中做了些什么。


[—>ZygoteConnection.java]

private void handleChildProc(Arguments parsedArgs,FileDescriptor[]descriptors,

PrintStream newStderr)throws ZygoteInit.MethodAndArgsCaller{

……//根据传入的参数设置新进程的一些属性。

//SS发来的参数中有“—runtime-init”,所以parsedArgs.runtimeInit为true。

if(parsedArgs.runtimeInit){

RuntimeInit.zygoteInit(parsedArgs.remainingArgs);

}else{

……

}

}

[—>RuntimeInit.java]

public static final void zygoteInit(String[]argv)

throws ZygoteInit.MethodAndArgsCaller{

//重定向标准输出和错误输出。

System.setOut(new AndroidPrintStream(Log.INFO,"System.out"));

System.setErr(new AndroidPrintStream(Log.WARN,"System.err"));

commonInit();

//下面这个函数为native函数,最终会调用AppRuntime的onZygoteInit,在那个函数中

//建立了和Binder的关系。

zygoteInitNative();

int curArg=0;

……

String startClass=argv[curArg++];

String[]startArgs=new String[argv.length-curArg];

System.arraycopy(argv,curArg,startArgs,0,startArgs.length);

//最终还是调用invokeStaticMain函数,这个函数我们已经见识过了。

invokeStaticMain(startClass,startArgs);

}


zygote分裂子进程后,自己将在handleParentProc中做一些扫尾工作,然后继续等待请求进行下一次分裂。

提示 这个android.app.ActivityThread类,实际上是Android中apk程序所对应的进程,它的main函数就是apk程序的main函数。从这个类的命名(android.app)中也可以看出些端倪。

通过这一节的分析,读者可以想到,Android系统运行的那些apk程序,其父都是zygote。这一点,可以通过adb shell登录后,用ps命令查看进程和父进程号来确认。