美文网首页
应用进程的启动流程

应用进程的启动流程

作者: 六月小微风Online | 来源:发表于2019-10-18 01:38 被阅读0次
    1.基础:Linux进程的启动(两种策略)
    • 子进程继承父进程的执行环境
    if((pid == fork()< 0)){
        //error
    }else if(pid == 0){
      //child process
    }else{
      //parent process
    }
    
    • 自主配置子进程的执行环境
    //child process
    execve(path,……);
    
    2.Android应用进程的启动

    (1)谁发起的进程启动
    (2)谁真正启动的应用

    3.触发进程的启动
    • AMS中判断进程是否启动的逻辑
    ProcessRecord app = getProcessRecordLocked(……);
    if(app!=null && app.thread!=null){
      //1.进程已启动 2.已启动的进程完成了向AMS的报告
      return;
    }
    startProcessLoced(r.processName);
    

    在AMS端有三项关于app重要判断

    …… startProcessLoced(r.processName){
      if(app != null && app.pid != null){
        if(app.thread == null){
          //
          return app;
        }
      }
    }
    
    

    startProcessLoced()的具体工作:

    • 打开本地Socket
    • 通过Socket发送参数列表(其中就有"ActivityThread"这个名字)
      发送之后,就开始等待结果:
    • Zygote返回创建好的进程的PID

    Zygote受到该请求后如何处理?

    //Zygote的loop在一直循环,等待有Socket请求,终于等到了
    boolean runOnce(){
      //1.读取受到的参数列表String args;
      
      //2.Zygote的常规父子进程操作
    }
    
    

    AMS-Zygote-Ap在进程创建时的交互.jpg

    app.thread将会被AMS保存至ProcessRecord中
    上述“ 向AMS的报告 ”过程需要 AP进程和AMS的跨进程通信

    • AMS与AP的交互
      AMS (IApplicationThread) | AP(IActivityManager)

    注意,AP的binder是通过ServiceManager查到的,但是这里有一个疑问,AMS是怎么得到AP的binder句柄的?因为Ap并没有向SM注册(AP也不是服务不可能去注册)
    答案是:AP启动的时候,不仅向AMS报告了app.thread,而且向AMS传递了IApplicationThread

    4.谁真正启动的应用

    //

    5.AP启动过程:ActivityThread
    public static void main(String[] args){
      Looper.prepareMainLooper();
      
      ActivityThread thread = new ActivityThread();
    
      thread.attch(false);
      //1.重要:与AMS通信过程
      //2.重要:ViewRootImpl创建过程
      //3.Instrumentation创建过程
    
      Looper.loop();
      throw new RuntimeException("Main thread loop unexpectedly exited");
    }
    
    6.组件什么时候启动

    以应用Service为例:
    (1)如果请求启动应用Service时,AMS查询到启所在进程已经启动,那么就直接启动该Service
    (2)如果请求启动应用Service时,AMS查询到:

    • app == null
      则向Zygote发出创建进程的请求(携带进程的名字"ActivityThread);
    • app.pid == 0
      说明Zygote还没有向AMS返回创建进程的结果
    • app.thread == null
      说明Ap虽然已经创建,但是还没有向AMS登记。

    在第二种情况下,应用Service会被暂存入mPendingSevice,等到(2)的过程成功执行之后,再从mPendingService取出(并且remove),然后执行Service

    相关文章

      网友评论

          本文标题:应用进程的启动流程

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