應(yīng)用進程的啟動流程

1.基礎(chǔ):Linux進程的啟動(兩種策略)
  • 子進程繼承父進程的執(zhí)行環(huán)境
if((pid == fork()< 0)){
    //error
}else if(pid == 0){
  //child process
}else{
  //parent process
}
  • 自主配置子進程的執(zhí)行環(huán)境
//child process
execve(path,……);
2.Android應(yīng)用進程的啟動

(1)誰發(fā)起的進程啟動
(2)誰真正啟動的應(yīng)用

3.觸發(fā)進程的啟動
  • AMS中判斷進程是否啟動的邏輯
ProcessRecord app = getProcessRecordLocked(……);
if(app!=null && app.thread!=null){
  //1.進程已啟動 2.已啟動的進程完成了向AMS的報告
  return;
}
startProcessLoced(r.processName);

在AMS端有三項關(guān)于app重要判斷

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

startProcessLoced()的具體工作:

  • 打開本地Socket
  • 通過Socket發(fā)送參數(shù)列表(其中就有"ActivityThread"這個名字)
    發(fā)送之后,就開始等待結(jié)果:
  • Zygote返回創(chuàng)建好的進程的PID

Zygote受到該請求后如何處理?

//Zygote的loop在一直循環(huán),等待有Socket請求,終于等到了
boolean runOnce(){
  //1.讀取受到的參數(shù)列表String args;
  
  //2.Zygote的常規(guī)父子進程操作
}


AMS-Zygote-Ap在進程創(chuàng)建時的交互.jpg

app.thread將會被AMS保存至ProcessRecord中
上述“ 向AMS的報告 ”過程需要 AP進程和AMS的跨進程通信

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

注意,AP的binder是通過ServiceManager查到的,但是這里有一個疑問,AMS是怎么得到AP的binder句柄的?因為Ap并沒有向SM注冊(AP也不是服務(wù)不可能去注冊)
答案是:AP啟動的時候,不僅向AMS報告了app.thread,而且向AMS傳遞了IApplicationThread

4.誰真正啟動的應(yīng)用

//

5.AP啟動過程:ActivityThread
public static void main(String[] args){
  Looper.prepareMainLooper();
  
  ActivityThread thread = new ActivityThread();

  thread.attch(false);
  //1.重要:與AMS通信過程
  //2.重要:ViewRootImpl創(chuàng)建過程
  //3.Instrumentation創(chuàng)建過程

  Looper.loop();
  throw new RuntimeException("Main thread loop unexpectedly exited");
}
6.組件什么時候啟動

以應(yīng)用Service為例:
(1)如果請求啟動應(yīng)用Service時,AMS查詢到啟所在進程已經(jīng)啟動,那么就直接啟動該Service
(2)如果請求啟動應(yīng)用Service時,AMS查詢到:

  • app == null
    則向Zygote發(fā)出創(chuàng)建進程的請求(攜帶進程的名字"ActivityThread);
  • app.pid == 0
    說明Zygote還沒有向AMS返回創(chuàng)建進程的結(jié)果
  • app.thread == null
    說明Ap雖然已經(jīng)創(chuàng)建,但是還沒有向AMS登記。

在第二種情況下,應(yīng)用Service會被暫存入mPendingSevice,等到(2)的過程成功執(zhí)行之后,再從mPendingService取出(并且remove),然后執(zhí)行Service

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容