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了。
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了。
相关文章推荐
- Android 儿子Activity在启动过程中的流程组件 && 儿子Activity在一个新的进程组件启动过程
- android N进程启动流程(二)(上一个activity的暂停、进程启动、绑定进程与创建application)
- Android系统启动App及 app怎么去启动一个Activity的流程总结
- android coreApp=true属性以及android4.2及以下多用户进程启动的说明
- android启动一个应用程序大概流程
- Android中bindService的细节之一:从进程的角度分析绑定Service的流程【Service所在进程首次启动】
- Android 一个app启动另一个app
- Android Application Launch [ 创建进程--〉绑定App-->启动Activity/Start Service/...]
- Android 一个app启动另一个app
- Android在一个APP中通过包名或类名启动另一个APP
- Android 中如何从一个App启动另外一个App(如启动支付界面、启动地图界面、应用商场下载App等场景)
- Android System进程启动流程
- Android进程启动流程
- 解决android启动app时出现短暂的黑屏或一个带title的界面
- Android 应用进程启动流程
- App 冷启动:给 Android 的 Activity 添加一个背景
- Android O: init进程启动流程分析(阶段三)
- coreApp=true属性及android4.2下多用户进程启动说明
- Android在Activity中启动一个新进程报错:Can't create handler inside thread that has not called Looper.prepare()。
- 新 Android在一个APP中通过包名或类名启动另一个APP