????????
目錄
App啟動概述
App啟動過程
App啟動過程圖
源碼概述
跨進程啟動
進程內啟動
下面以應用桌面Launcher啟動App的MainActivity來舉例:
App啟動概述
????????首先,MainActivity是由Launcher組件來啟動的,而Launcher又是通過Activity管理服務ActivityManagerService(AMS)來啟動MainActivity組件的。由于MainActivity組件和Launcher組件,以及AMS是三個不同的進程, 所以這三個不同的進程只能通過 Binder進程間通信機制來完成MainActivity組件的啟動過程。
App啟動過程
- Launcher組件向AMS發送一個啟動MainActivity組件進程間通信請求。
- AMS首先要將啟動MainActivity的信息保存起來,然后向Launcher發送一個中止狀態的進程間通信請求。
- Launcher組件進入到中止狀態以后,會向AMS發送一個已經進入了中止狀態的進程間通信請求,以便 AMS可以繼續執行啟動 MainActivity組件的操作。
- AMS如果發現啟動MainActivity進程不存在,就會創建一個新的應用程序進程。
- 新的應用程序進程啟動后,就會向AMS發送一個啟動完成的進程間通信請求,以便 AMS可以繼續執行啟動MainActivity組件的操作。
- AMS將第二步保存下來的MainActivity的信息發送到第四步啟動創建的應用程序進程,以便它可以將MainActivity組件啟動起來。
App啟動過程圖
源碼概述
跨進程啟動
- 當前進程請求AMS:當前進程采用Binder IPC向system_server進程(AMS)發起startActivity請求;
- AMS發送創建應用進程請求:system_server進程接收到請求后,向zygote進程發送創建進程的請求;
- Zygote進程接受請求并fork應用進程,即App進程;
- App進程通過Binder向AMS發起attachApplication請求,AMS綁定ApplicationThread;
- AMS發送啟動Activity請求:system_server進程在收到請求后,進行一系列準備工作后,再通過binder IPC向App進程發送scheduleLaunchActivity請求;
- ActivityThread的Handler處理啟動Activity請求:App進程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程(ActivityThread)發送LAUNCH_ACTIVITY消息;
- 主線程在收到Message后,通過發射機制創建目標Activity,并回調Activity.onCreate、onResume等方法,UI渲染結束后便可以看到App主界面。
進程內啟動
- 當前進程請求AMS;
- AMS發送啟動Activity請求:system_server進程接收到請求后,解析Activity信息、處理啟動參數,并給當前進程發送 scheduleLaunchActivity請求;
- ActivityThread的Handler處理啟動Activity請求:App進程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程(ActivityThread)發送LAUNCH_ACTIVITY消息;
- 主線程在收到Message后,通過發射機制創建目標Activity,并回調Activity.onCreate、onResume等方法,UI渲染結束后便可以看到App主界面。