【白話】App從啓動到頁面顯示出來發生了什麼

  1. 點擊App圖標,Launcher進程採用Binder IPC向system_server進程發起startActivity請求
  2. system_server收到請求後,向Zygote進程發送創建進程的請求
  3. Zygote進程fork出新的子進程,即App進程
  4. App進程創建出來後,通過Binder IPC向system_server發起attachApplication請求
  5. system_server收到請求後,進行一系列的準備工作,再通過bind IPC向App進程發送scheduleLaunchActivity請求
  6. App進程的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送LAUNCH_ACTIVITY消息
  7. 主線程收到message後,通過發射機制創建目標Activity,並回調Activity.onCreate()等方法
  8. App開始正式啓動,正式進入Activity生命週期,執行完一系列的生命週期方法,UI渲染,然後就可以看到主界面了

【通俗的講】

  1. 當你點擊App圖標的時候,你就要告訴系統,“嗨,夥計,我要啓動這個哥們了”,我們知道進程間通信大多數是用的Binder機制,就相當於你告訴服務器,我要發起一個請求了啊
  2. 這個服務小弟(系統服務)收到消息後,“那我得去向老大說一下這邊想創建個進程出來”,即向孵化器發送請求
  3. 老大(孵化器)聽到後,“可以啊,來吧,我給你創建出來,記着到時候去咱們的系統裏面做個備案記錄下”
  4. 創建出來後,App創建出來後,要去服務小弟那裏根據自己的情況,根據自己的情況去工商局辦理營業執照(這就是平時我們應用中做一些先做的東西需要在Application中的原因)
  5. 服務小弟(系統服務)去做好記錄後,就去叫這個進程起牀幹活了
  6. App被叫醒後,先送個指令,我得先去洗個臉畫個妝
  7. 大腦收到指令後,就走過去那些瓶瓶罐罐的
  8. 然後開始化妝,弄完後出門,就讓人看到了

Zygote

  “受精卵”,更傾向於叫孵化器,是由linux的init進程fork出來的,而爲了實現資源共享和更快的啓動速度,之後所有的進程全都又第一個zygote fork出來

system_server

也是一個進程,所以也是由zygote進程fork出來的,這個從名字也可以看出來是系統級的服務,系統裏面的一些重要服務都是在這個進程開啓的,像AMS,PMS,WMS

ActivityManagerService

簡稱AMS,服務端對象,負責系統中所有Activity的生命週期,ams進行初始化的時機非常明確,就是SystemServer進行開啓的時候初始化

Launcher

本質上也是一個應用程序,跟普通的App一樣,也是繼承Activity

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章