一張圖概括App啟動流程

一、神圖:

這裡寫圖片描述

二、說明

筆者在下面博文內容的基礎上,加上自己的理解,對圖片稍加了一點點修改,啟動流程文字部分也有所修改
參考:http://www.sohu.com/a/130814934_675634 (感謝樓主)

三、啟動流程:

①點選桌面App圖示,Launcher程序採用Binder IPC向system_server程序發起startActivity請求;(startActivity()中呼叫ActivityManagerProxy.startActivity(),最終通過Binder執行system_server程序中的AMS中的startActivity()函式)

②system_server程序接收到請求後,向zygote程序傳送建立程序的請求;(這一步AMS中startActivity()裡面會呼叫startProcessLocked()函式,最終之行Process.start()函式,其最終呼叫了Zygote並通過socket通訊的方式讓Zygote程序fork除了一個新的程序,並根據我們剛剛傳遞的”android.app.ActivityThread”字串,反射出該物件並執行ActivityThread的main方法)。

③Zygote程序fork出新的子程序,即App程序;

④App程序,通過Binder IPC向sytem_server程序發起attachApplication請求;(ActivityThread的main()函式裡面會建立ActivityThread物件並呼叫attach()函式

ActivityThread thread = new ActivityThread(); 
thread.attach(false);
//attach()中呼叫ActivityManagerProxy的attachApplication(),也就是最終通過Binder機制呼叫了ActivityManagerService的attachApplication

⑤system_server程序在收到請求後,進行一系列準備工作後,再通過binder IPC向App程序傳送scheduleLaunchActivity請求;

⑥App程序的binder執行緒(ApplicationThread)在收到請求後,通過handler(ActivityThread.H)向主執行緒傳送LAUNCH_ACTIVITY訊息;

⑦主執行緒在收到Message後,通過發射機制建立目標Activity,並回撥Activity.onCreate()等方法。(performLaunchActivity() 通過classLoader(通過LoadedApk物件來獲取)載入類,然後通過反射生成物件,最後回撥Activity.onCreate()等方法)

⑧到此,App便正式啟動,開始進入Activity生命週期,執行完onCreate/onStart/onResume方法,UI渲染結束後便可以看到App的主介面。