美文网首页
Activity,Application的启动

Activity,Application的启动

作者: R7_Perfect | 来源:发表于2019-08-01 22:15 被阅读0次

    创建进程

    687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f333938353536332d656439316664376332343065366264332e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f737472697025.png

    ①App发起进程:当从桌面启动应用,则发起进程便是Launcher所在进程;当从某App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送消息给system_server进程;

    ②system_server进程:调用Process.start()方法,通过socket向zygote进程发送创建新进程的请求;

    ③zygote进程:在执行ZygoteInit.main()后便进入runSelectLoop()循环体内,当有客户端连接时便会执行ZygoteConnection.runOnce()方法,再经过层层调用后fork出新的应用进程;

    ④新进程:执行handleChildProc方法,最后调用ActivityThread.main()方法。

    绑定Application

    687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f333938353536332d636462613331396461623332643063372e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f737472697025.png

    ATP: ApplicationThreadProxy

    AT: ApplicationThread

    AMP: ActivityManagerProxy

    AMS:ActivityManagerService

    ActivityThread.bindApplication -> LoadedApk.makeApplication -> LoadedApk.newApplication -> Instrumentation.newApplication -> AppComponentFactory.instantiateApplication -> ClassLoader.loadClass ... -> Instrumentation.callApplicationOnCreate -> Application.onCreate()

    显示Activity界面

    687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f333938353536332d656439316664376332343065366264332e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f737472697025.png

    Binder通信

    687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f333938353536332d636462613331396461623332643063372e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f737472697025.png

    ①system_server进程中调用startProcessLocked方法,该方法最终通过socket方式,将需要创建新进程的消息告知Zygote进程,并阻塞等待Socket返回新创建进程的pid;

    ②Zygote进程接收到system_server发送过来的消息, 则通过fork的方法,将zygote自身进程复制生成新的进程,并将ActivityThread相关的资源加载到新进程app process,这个进程可能是用于承载activity等组件;

    ③ 在新进程app process向servicemanager查询system_server进程中binder服务端AMS, 获取相对应的Client端,也就是AMP. 有了这一对binder c/s对, 那么app process便可以通过binder向跨进程system_server发送请求,即attachApplication()

    ④system_server进程接收到相应binder操作后,经过多次调用,利用ATP向app process发送binder请求, 即bindApplication. system_server拥有ATP/AMS, 每一个新创建的进程都会有一个相应的AT/AMP,从而可以跨进程 进行相互通信. 这便是进程创建过程的完整生态链。

    应用内启动

    image.png

    App的启动流程

    image.png

    相关文章

      网友评论

          本文标题:Activity,Application的启动

          本文链接:https://www.haomeiwen.com/subject/grshdctx.html