上文中的Socket由frameworks/base/core/java/com/Android/internal/os/ZygoteInit.java文件中的ZygoteInit类在runSelectLoopMode函数侦听的。

Step 5. ZygoteInit.runSelectLoopMode
这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
- [java] view plaincopypublic class ZygoteInit {
 - ......
 - /**
 - * Runs the zygote process's select loop. Accepts new connections as
 - * they happen, and reads commands from connections one spawn-request's
 - * worth at a time.
 - *
 - * @throws MethodAndArgsCaller in a child process when a main() should
 - * be executed.
 - */
 - private static void runSelectLoopMode() throws MethodAndArgsCaller {
 - ArrayList fds = new ArrayList();
 - ArrayList peers = new ArrayList();
 - FileDescriptor[] fdArray = new FileDescriptor[4];
 - fds.add(sServerSocket.getFileDescriptor());
 - peers.add(null);
 - int loopCount = GC_LOOP_COUNT;
 - while (true) {
 - int index;
 - /*
 - * Call gc() before we block in select().
 - * It's work that has to be done anyway, and it's better
 - * to avoid making every child do it. It will also
 - * madvise() any free memory as a side-effect.
 - *
 - * Don't call it every time, because walking the entire
 - * heap is a lot of overhead to free a few hundred bytes.
 - */
 - if (loopCount <= 0) {
 - gc();
 - loopCount = GC_LOOP_COUNT;
 - } else {
 - loopCount--;
 - }
 - try {
 - fdArray = fds.toArray(fdArray);
 - index = selectReadable(fdArray);
 - } catch (IOException ex) {
 - throw new RuntimeException("Error in select()", ex);
 - }
 - if (index < 0) {
 - throw new RuntimeException("Error in select()");
 - } else if (index == 0) {
 - ZygoteConnection newPeer = acceptCommandPeer();
 - peers.add(newPeer);
 - fds.add(newPeer.getFileDesciptor());
 - } else {
 - boolean done;
 - done = peers.get(index).runOnce();
 - if (done) {
 - peers.remove(index);
 - fds.remove(index);
 - }
 - }
 - }
 - }
 - ......
 - }
 
当Step 4将数据通过Socket接口发送出去后,就会下面这个语句:
- [java] view plaincopydone = peers.get(index).runOnce();
 
这里从peers.get(index)得到的是一个ZygoteConnection对象,表示一个Socket连接,因此,接下来就是调用ZygoteConnection.runOnce函数进一步处理了。