Android系統到應用啓動流程分析

1、Android系統啓動

Android系統啓動從用戶按下電源鍵開始。

  • 用戶按下電源鍵,引導芯片代碼從預定義的地方開始執行,加載引導程序BootLoader到RAM,然後開始執行。

  • 啓動引導程序BootLoader,用來引導Android系統的啓動工作。然後,Linux內核啓動。

  • Linux內核啓動後,設置緩存、被保護存儲器、計劃列表、加載驅動等操作。當內核完成系統設置後,會查找“init”文件,然後啓動Root進程。

  • Linux內核創建用戶級進程,init進程(上帝般存在)。

  • Init進程會創建Zygote孵化器進程。Zygote進程存在一個Socket服務端,以及一些Framework層共享的類和資源。

  • Zygote進程會先孵化出一個SystemServer進程。SystemServer進程用來加載一些系統服務,比如AMS、WMS、PMS等,保存有系統服務需要的類和資源,存在一個Socket客戶端。

  • AMS服務用來管理Activity的創建,當需要啓動Activity時,會通過SystemServer進程中的Socket客戶端向Zygote進程發送消息,請求創建Activity。

init進程是Android系統中用戶空間的第一個進程,作爲第一個進程,它被賦予了很多極其重要的工作職責,比如創建zygote(孵化器)和屬性服務等。init進程是由多個源文件共同組成的,這些文件位於源碼目錄system/core/init。

以上部分內容引用於劉望舒的博客:https://blog.csdn.net/itachi85/article/details/54783506

2、App啓動過程

App啓動從用戶按下桌面圖標開始。

  • App都是由桌面啓動器啓動的,桌面啓動器自身也是一個App,它也存在一個進程,稱爲Launcher進程,也叫調用者進程。

  • 用戶按下桌面上的App圖標後,Launcher進程會將請求啓動主活動(MainActivity)的請求以Binder的方式發送給AMS服務。

  • AMS服務收到請求後,交付給ActivityStarter處理intent和flag信息,然後交給ActivityStackSuperVisior/ActivityStack處理Activity進程相關流程,同時通過Socket客戶端向Zygote進程請求孵化新進程。

  • Zygote進程收到請求後,創建一個新進程,這個新進程就是APP所在進程。

  • 在新進程裏創建ActivityThread線程,包含main方法,是Android程序的入口,ActivityThread所在線程即是主線程(UI線程)。同時創建ApplicationThread和W線程,他們都繼承自Binder類。ApplicationThread線程在主活動創建之前創建,負責監聽AMS發送來的創建Activity的請求。Activity創建後,W線程監聽WMS發來的消息(比如點擊和觸摸事件),將消息發送給DectorView,如果DecoterView沒有處理,則傳遞給PhoneWindow,如果PhoneWindow也沒有處理,則傳遞給Activity通過Handler來處理消息。

  • ActivityThread中會調用prepareMainLooper()方法,創建一個Looper對象,Looper對象會創建一個消息隊列MessageQueue,調用Looper.loop()方法後UI線程會進入消息循環體,不斷從消息隊列中取出消息Message對象並處理消息。

  • ApplicationThread類監聽到了創建Activity的請求,ActivityThread通過ClassLoader類加載器加載Activity並創建Activity實例,然後回調onCreate()方法。

3、其他解釋

系統服務主要由WMS與AMS構成,其中WMS主要負責監聽與處理與窗口相關的事件(如監聽用戶點擊、手勢),AMS主要負責管理Activity(如創建Activity)。

WMS主要由兩個類組成:KeyQ類、InputDispatcherThread類。這兩個分別創建一個線程,KeyQ類負責不斷將用戶消息存儲到QueueEvent消息隊列中,InputDispatcherThread負責不斷從QueueEvent中取出消息進行處理或分發給相應應用。

ActivityStarter:Activity啓動控制器

ActivityStack:管理任務棧裏的Activity

參考文章:

https://www.cnblogs.com/bRAyKpoyNt/p/3649417.html

http://www.cnblogs.com/bRAyKpoyNt/p/3647344.html



本文轉載:  鏈接:https://www.jianshu.com/p/d1e8002df580
 

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