您的位置:首页 > 移动开发

Android app启动一个新进程流程

2013-07-26 15:46 701 查看
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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: