Android app启动一个新进程流程

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了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值