站在巨人的肩膀上學習,本片博客參考 gityuan,用於筆記和鞏固知識node
Google提供的5層很經典,可是爲了更進一步的透視Android 系統架構,以進程的視角,以分層的架構,來詮釋Android的全貌,詮釋Android 全貌的內在聯繫linux
Android 系統啓動過程由上圖從下向上的一個過程,由Boot Loader引導開機,而後依次進入Kernel
-> Native
-> Framework
-> App
,下面簡要介紹這幾個過程android
開機(關於Loader層)git
ROM
裏預設的代碼開始執行,而後加載程序到RAM
關於Kernel (Linux內核層)安全
Android 平臺的基礎是Linux內核,好比ART虛擬機最終調用的是Linux內核執行的功能,Linux內核的安全機制爲Android提供相應的保障,也容許設備製造商爲內核開發硬件驅動程序多線程
kthreadd進程是全部內核進程的鼻祖
關於硬件抽閒層(HAL)架構
硬件抽象層(HAL)提供標準接口,HAL包括多個庫模塊,每一個模塊都爲特定的硬件組件實現一組接口,好比Wifi/藍牙模塊,當框架API請求訪問硬件時,Android系統將爲該硬件加載相應的庫模塊app
Android Runtime 和 系統庫框架
每一個應用都在本身的進程中運行,都有本身的虛擬機實例,ART經過執行dex文件可在設備能運行多個虛擬機,DEX文件是專門爲Android設計的字節碼格式,通過優化使用的內存很小,ART主要包括的工能是,預先(AOT)和即時(JIT)編譯 ,優化垃圾回收(GC),以及調試相關支持oop
這裏的Native系統庫主要包括,init孵化來的用戶空間的守護進程,HAL層以及開機動畫等,啓動init進程(pid=1),是Linux系統的用戶進程,init進程是全部用戶進程的鼻祖
ServiceManager
(Binder的管家),bootanim
(開機動畫)等重要服務Zygote是全部Java進程的父進程
,Zygote進程自己就是init進程孵化出來的Framework層
System Server是Zygote孵化出的第一個進程
,System Server 負責啓動和管理整個Java FrameWork,包含ActivityManagerService, WorkManagerService,PagerManagerService,PowerManagerService等服務App層
Syscall && JNI
init
,
Zygote
,
ServiceMager
,
system_server
Linux系統中用戶空間的第一個進程init.main
init進程還啓動了ServiceManager進程
(Binder的管家),bootanim
(開機動畫)等重要服務
init 進程還孵化除了Zygote進程
,Zygote進程是Android中的第一個Java進程(即虛擬機進程)
,Zygote是全部Java進程的父進程
,Zygote進程自己就是init進程孵化出來的
全部App的父進程,ZygoteInit.main
Zygote進程,是由init進程經過解析init.rc文件後fork生成的,Zygote進程主要包括
system_server進程,是由Zygote fork而來,System Server是Zygote孵化出的第一個進程
,System Server 負責啓動和管理整個Java FrameWork,包含ActivityManagerService, WorkManagerService,PagerManagerService,PowerManagerService等服務
系統各大服務的載體, SystemServer.main system_server進程從源碼角度來看能夠分爲,引導服務,核心服務和其餘服務
bInder服務的大管家
ServiceManager 是Binder IPC通訊過程當中的守護進程,自己也是一個Binder,可是並無採用多線程模型來跟Binder通訊,而是自行編寫了binder.c直接和Binder驅動來通訊,而且只有一個binder_loop來讀取和處理事務,這樣作的好處是簡單和高效 ServiceManager自己工做相對簡單,其工能查詢和註冊服務
流程圖
啓動主要包括如下幾個階段
Launcher
,這是用戶看到的桌面AppBrowser
,Phone
,Email
等App進程,每一個App至少運行在一個進程上Zygote fork
而成進程與線程的區別
進程:每一個App啓動前必須先建立一個進程,該進程是由Zygote fork
出來,進程具備獨立的資源空間,用於承載App運行的各類Activity/Service組件,進程對於上層的應用層來講是徹底透明的,這也是Google刻意爲之,讓App程序都運行在Android Runtime,大多數狀況一個App運行在一個進程中,除非在AndroidManifest.xml文件中配置了Android:process
,或者經過Native代碼fork進程
線程:線程對於咱們來講比較熟悉,好比每次new Thread().start,都會建立一個新的線程,該線程沒有本身的獨立空間,而是與所在的進程資源共享,從Linux來講,進程與線程都是task_struct結構體,除了是否資源共享外,沒有任何區別
看一下進程建立的過程
ZygoteInit.main()
後進入runSelectLoop()
循環體,當有客戶端鏈接時,便會執行ZygoteConnection.runOnce()
方法,再通過層層調用後fork出新的應用進程handleChildProc
方法,設置進程名,打開binder驅動,啓動新的binder線程,設置art虛擬機參數,反射目標類的main方法,即調用ActivityThread.main()
方法Process.start()方法是阻塞方法,等待直到進程建立完成返回響應的pid,才完成該方法