Android app需要启动一个新进程来运行是从ActivityManagerService中的startProcessLocked开始的
step1: ActivityManaagerService.java/startProcessLocked()
call int pid = Process.start("android.app.ActivityThread",
mSimpleProcessManagement ? app.processName : null, uid, uid,
gids, debugFlags, null) 设置新进程将要加载的java类,进入Process.java中处理。
step2: Process.java/start()
call return startViaZygote(processClass, niceName, uid, gid, gids,
debugFlags, zygoteArgs)进一步操作.
step3: process.java/startViaZygote()
call argsForZygote.add()把创建进程的参数都写入到 argsForZygote这个字符串数组.
call pid = zygoteSendArgsAndGetPid(argsForZygote)进一步处理.
step4: Process.java/zygoteSendArgsAndGetPid()
call openZygoteSocketIfNeeded()打开/dev/socket/zygote和zygote进程通信,向Zygote进程发送创建新进程的参数。Zygote进程在ZygoteInit.java/runSelectLoopMode中监听ActivityManagerService通过socket发过来的信息。
step5: ZygoteInit.java/runSelectLoopMode()
收到ActivityManagerService发过来的信息之后,call done = peers.get(index).runOnce()进入ZygoteConnection.runOnce中处理.
step6: ZygoteConnection.java/runOnce()
call pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, parsedArgs.debugFlags, rlimits)fork出一个新的进程,
call handleChildProc(parsedArgs, descriptors, newStderr)进行子进程的后期处理。
step7: ZygoteConnection.java/handleChildProc()
call RuntimeInit.zygoteInit(parsedArgs.remainingArgs)初始化运行时库
step8: RuntimeInit.java/ZygoteInit()
call commonInit()初始化键盘操作
call zygoteInitNative()启动一个binder线程池
call invokeStaticMain(startClass, startArgs)进入invokeStaticMain()中处理。
step9: RuntimeInit.java/invokeStaticMain()
call throw new ZygoteInit.MethodAndArgsCaller(m, argv)抛出一个异常进入到android.app.ActivityThread中main方法中执行
step10: ActivityThread.java/main()
call ActivityThread thread = new ActivityThread()创建一个ActivityThread对象
这样就可以在这个进程中启动activity或者service了。