详细分析Android中实现Zygote的源码

2020-01-06 13:36:52丽君
  • }   
  • if (argv[1].equals("start-system-server")) {  // 3. 启动system-server 
  • startSystemServer();  } else if (!argv[1].equals("")) { 
  • throw new RuntimeException(argv[0] + USAGE_STRING);  } 
  •   Log.i(TAG, "Accepting command socket connections"); 
  •   // 4. 进入请求应答模式 
  • runSelectLoop();  closeServerSocket(); 
  •   } catch(MethodAndArgsCaller caller) { 
  • caller.run();  } catch(RuntimeException ex) { 
  • Log.e(TAG, "Zygote died with exception", ex);  closeServerSocket(); 
  • throw ex;  } 
  • 上述代码中有5个重要的点,我已经通过标号标记出来了,接下来我们分别分析一下这5点函数的具体实现。

    建立IPC通信服务端——registerZygoteSocket

    zygote及系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的socket。registerZygoteSocket函数的使命正是建立这个Socket,实现代码如下:

     

     
    1. private static void registerZygoteSocket()  { 
    2. if (sServerSocket == null) {  int fileDesc; 
    3. try {  String env = System.getenv(ANDROID_SOCKET_ENV); 
    4. fileDesc = Integer.parseInt(env);  } catch (RuntimeException ex) { 
    5. throw new RuntimeException(ANDROID_SOCKET_ENV + " unset or invalid", ex);  }