Android设备启动过程当中,先是Linux内核加载完,接着Android中的第一个进程init启动,它会启动一些须要开机启动的进程。
Zygote就是进程init启动起来的。Android中全部应用程序进程,以及运行系统关键服务的System进程都是由Zygote建立的。它经过复制自身的形式建立其它进程。Zygote在启动时会在内部建立一个虚拟机实例,所以,经过复制Zygote获得的其它应用程序进程和System进程均可以快速地在内部得到一个虚拟机地拷贝。Zygote启动完成后就当即将System进程启动,以便各类关键服务被启动运行。java
它以服务的形式被启动。android
进程内建立一个虚拟机实例,并注册一系列JNI方法。
frameworks/base/core/jni/AndroidRuntime.cppapp
/* start the virtual machine. */ startVM(&mJavaVM, &env); /* Register android functions. */ startReg(env);
接下来执行“com.android.internal.os.ZygoteInit”Java类的main方法继续执行启动。socket
package com.android.internal.os; import android.net.LocalServerSocket; ... public class ZygoteInit { private static LocalServerSocket sServerSocket; public static void main(String argv[]) { ... registerZygoteSocket(); ... if (argv[1].equals("true")) { startSystemServer(); } else if (!argv[1].equals("false")) { throw new RuntimeException(argv[0] + USAGE_STRING); } ... if (ZYGOTE_FORK_MODE) { runForkMode(); } else { runSelectLoopMode(); } ... closeServerSocket(); ... } }
Zygote调用registerZygoteSocket();
建立一个LocalServerSocket sServerSocket
的Server端Socket,等待之后运行在System进程中的服务ActivityManagerService建立的Client端Socket链接,而后经过Socket进程间通讯通知Zygote建立新的应用程序进程。ide
/** * Prepare the arguments and fork for the system server process. */ private static boolean startSystemServer() throws MethodAndArgsCaller, RuntimeException { /* Hardcoded command line to start the system server */ String args[] = new String[] { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006", "--capabilities=130104352,130104352", "--rlimit=8,", "--runtime-init", "--nice-name=system_server", "com.android.server.SystemServer", }; ... ZygoteConnection.Arguments parsedArgs = null; int pid; try { parsedArgs = new ZygoteConnection.Arguments(args); /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, rlimits, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } /* For child process */ if (pid == 0) { handleSystemServerProcess(parsedArgs); } return true; }
变量args保存启动System进程的参数。
Zygote.forkSystemServer()复制当前进程来建立子进程。
handleSystemServerProcess()继续处理System进程的启动。oop
private static void runSelectLoopMode() throws MethodAndArgsCaller { ArrayList<FileDescriptor> fds = new ArrayList(); ArrayList<ZygoteConnection> peers = new ArrayList(); FileDescriptor[] fdArray = new FileDescriptor[4]; fds.add(sServerSocket.getFileDescriptor()); peers.add(null); while (true) { ... 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); } } } } /** * Waits for and accepts a single command connection. Throws * RuntimeException on failure. */ private static ZygoteConnection acceptCommandPeer() { try { return new ZygoteConnection(sServerSocket.accept()); } catch (IOException ex) { throw new RuntimeException( "IOException during accept()", ex); } }
无限循环,等待来自AMS建立的Socket链接。
sServerSocket在fds[0]位置。
每当accept()返回一个链接后,将对应此链接的newPeer.getFileDesciptor()套接字描述添加到fds(第0位置后),下一次读取到数据时,若在fds[0]之后的,说明是前面的newPeer链接收到的AMS的建立新应用程序进程的请求。
runOnce()用来处理AMS建立新应用程序进程的请求。ui
ZygoteInit.handleSystemServerProcess()执行System进程的启动操做。.net
private static void handleSystemServerProcess( ZygoteConnection.Arguments parsedArgs) throws ZygoteInit.MethodAndArgsCaller { closeServerSocket(); /* * Pass the remaining arguments to SystemServer. * "--nice-name=system_server com.android.server.SystemServer" */ RuntimeInit.zygoteInit(parsedArgs.remainingArgs); /* should never reach here */ }
Zygote复制自身建立的子进程作为System进程,这样它获得了Zygote的Server Socket,可是用不到,因此第一句closeServerSocket()
关闭此套接字。线程
package com.android.internal.os; public class RuntimeInit { public static final void zygoteInit(String[] argv) throws ZygoteInit.MethodAndArgsCaller { ... commonInit(); zygoteInitNative(); ... // Remaining arguments are passed to the start class's static main String startClass = argv[curArg++]; String[] startArgs = new String[argv.length - curArg]; System.arraycopy(argv, curArg, startArgs, 0, startArgs.length); invokeStaticMain(startClass, startArgs); } }
zygoteInitNative()在System进程中启动一个Binder线程池。
RuntimeInit.invokeStaticMain()静态方法调用"com.android.server.SystemServer"
的main方法。debug
传递调用native方法init1():
class SystemServer { /** * This method is called from Zygote to initialize the system. This will cause the native * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back * up into init2() to start the Android services. */ native public static void init1(String[] args); }
init1()的工做:
注册Service Manager的死亡通知:调用binderDied()。System进程执行kill结束本身。
建立SurfaceFlinger、和SensorService两个服务。
返回SystemServer.init2()继续启动java语言开发的系统服务。
public static final void init2() { Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start(); }
ServerThread继承自Thread。
class ServerThread extends Thread { @Override public void run() { Looper.prepare(); ... // Critical services... try { ... Slog.i(TAG, "Activity Manager"); context = ActivityManagerService.main(factoryTest); ... Slog.i(TAG, "Package Manager"); pm = PackageManagerService.main(context, factoryTest != SystemServer.FACTORY_TEST_OFF); ... Slog.i(TAG, "Content Manager"); ContentService.main(context, factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL); ... Slog.i(TAG, "Window Manager"); wm = WindowManagerService.main(context, power, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL); ServiceManager.addService(Context.WINDOW_SERVICE, wm); ... ((ActivityManagerService)ServiceManager.getService("activity")) .setWindowManager(wm); ... } catch (RuntimeException e) { Slog.e("System", "Failure starting core service", e); } ... Looper.loop(); Slog.d(TAG, "System ServerThread is exiting!"); } }
启动各个Service而后注册到ServiceManager。
各个服务都使用Binder和其它服务使用者进程进行就行交互。
(本文使用Atom编写)