

1、Application應(yīng)用層
上層應(yīng)用,比如我們編寫的項(xiàng)目、系統(tǒng)應(yīng)用。主要有java / kotlin語(yǔ)言編寫。
2、FrameWork應(yīng)用框架層
為開發(fā)人員提供了可以開發(fā)應(yīng)用程序所需要的API.
-
ActivityManager
負(fù)責(zé)管理所有應(yīng)用程序中的Activity,它掌握所有Activity的情況,具有所有調(diào)度Activity生命周期的能力,簡(jiǎn)單來(lái)說,ActivityManager是管理和掌控所有的Activity. -
WindowManager
控制窗口的顯示、隱藏以及窗口的層序,簡(jiǎn)單來(lái)說,它就是管理窗口的,大多數(shù)和View有關(guān)系的都要和它打交道。 -
NotificationManager
使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息 -
PackageManager
管理所有安裝在Android系統(tǒng)中的應(yīng)用程序 -
TelephonyManager
管理所有的移動(dòng)設(shè)備功能 -
ResourceManager
提供應(yīng)用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等 -
LocationManager
提供地理位置以及定位功能服務(wù) -
ContentPaoviders
使得不同應(yīng)用程序之間可以共享數(shù)據(jù) -
ViewSystem
構(gòu)建應(yīng)用程序的基本組件 -
XMPPService
可擴(kuò)展通訊和表示協(xié)議。前身為Jabber,提供即時(shí)通信服務(wù)。例如推送功能,Google Talk
Framework層才真正是Java語(yǔ)言實(shí)現(xiàn)的層,在這層里定義的API都是用Java語(yǔ)言編寫
3、Native Library層+Android Runtime
系統(tǒng)運(yùn)行庫(kù)層分為兩部分,分別是C/C++程序庫(kù)和Android運(yùn)行時(shí)庫(kù)。
-
AndroidRuntime
運(yùn)行時(shí)庫(kù)又分為核心庫(kù)和ART,核心庫(kù)提供了Java語(yǔ)言核心庫(kù)的大多數(shù)功能,這樣開發(fā)者可以使用Java語(yǔ)言來(lái)編寫Android應(yīng)用。
-
JVM - Dalvik - ART
相較于JVM,Dalvik虛擬機(jī)是專門為移動(dòng)設(shè)備定制的,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例,并且每一個(gè)Dalvik 應(yīng)用作為一個(gè)獨(dú)立的Linux 進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時(shí)候所有程序都被關(guān)閉。而替代Dalvik虛擬機(jī)的ART 的機(jī)制與Dalvik 不同。在Dalvik下,應(yīng)用每次運(yùn)行的時(shí)候,字節(jié)碼都需要通過即時(shí)編譯器轉(zhuǎn)換為機(jī)器碼,這會(huì)拖慢應(yīng)用的運(yùn)行效率,而在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼,使其成為真正的本地應(yīng)用。
4、HAL層(定義了HIDL接口,硬件抽象層)
將控制硬件的動(dòng)作放在硬件抽象層中。
5、Linux Kernel
Android 的核心系統(tǒng)服務(wù)基于Linux 內(nèi)核,在此基礎(chǔ)上添加了部分Android專用的驅(qū)動(dòng)。系統(tǒng)的安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型等都依賴于該內(nèi)核。

Zygote是什么?
Zygote進(jìn)程又稱受精卵進(jìn)程。
Zygote為什么叫受精卵進(jìn)程?
因?yàn)锳ndroid中所有的應(yīng)用進(jìn)程都是由Zygote進(jìn)程孵化出來(lái)的。
為什么所有進(jìn)程都是由Zygote孵化?
1. Zygote進(jìn)程在啟動(dòng)的時(shí)候會(huì)創(chuàng)建一個(gè)虛擬機(jī)實(shí)例,因此通過Zygote進(jìn)程創(chuàng)建的子進(jìn)程都會(huì)繼承這個(gè)虛擬機(jī)實(shí)例,App中的JAVA代碼可以得到翻譯執(zhí)行。
2. 進(jìn)程與進(jìn)程之間需要跨進(jìn)程通信,由Zygote進(jìn)程作為父進(jìn)程還可以獲得一個(gè)Binder線程池,這樣進(jìn)程之間就可以使用Binder進(jìn)行跨進(jìn)程通信了。
3. 由Zygote進(jìn)程作為父進(jìn)程,子進(jìn)程可以獲得一個(gè)消息循環(huán)。
Zygote都孵化了那些進(jìn)程(做了什么)?
-
啟動(dòng)SystemServer進(jìn)程
SystemServer 進(jìn)程,是zygote 進(jìn)程啟動(dòng)的過程中,孵化出來(lái)的第一個(gè)進(jìn)程。 -
孵化應(yīng)用進(jìn)程
相機(jī)APP、短信APP...
Zygote的啟動(dòng)流程?

- Init進(jìn)程(Linux內(nèi)核啟動(dòng)的第一個(gè)用戶級(jí)進(jìn)程)通過解析配置文件需要啟動(dòng)app_process程序。在app_main的main函數(shù)中做了更名為zygote的操作。
- 創(chuàng)建AppRuntime(為AndroidRuntime的子類)創(chuàng)建虛擬機(jī)、注冊(cè)JNI函數(shù)后通過JNI調(diào)用ZygoteInit進(jìn)入Java世界。
- 創(chuàng)建名為zygote的LocalServerSocket,通過這函數(shù)他可以響應(yīng)子孫后代的請(qǐng)求同時(shí)zygote
- preloadClasses:執(zhí)行時(shí)間比較長(zhǎng),這是導(dǎo)致Android系統(tǒng)啟動(dòng)慢的原因之一,
- preloadResources:主要加載framework-res.apk中的資源,在UI編程中常常飲用的com.android.R.***資源是系統(tǒng)默認(rèn)資源是由zygote記載的。
- fork出SystemServer
- 通過runSelectLoop循環(huán)處理進(jìn)程創(chuàng)建請(qǐng)求,一旦接收到請(qǐng)求啟用runOnce函數(shù)fork出子進(jìn)程
注:
- startVm這里調(diào)用JNI的函數(shù)創(chuàng)建虛擬機(jī),這個(gè)函數(shù)主要設(shè)置一些創(chuàng)建時(shí)的參數(shù)。
- startReg給創(chuàng)建的虛擬機(jī)注冊(cè)一些JNI函數(shù),因?yàn)檫M(jìn)入Java世界后這些原本用Native方式實(shí)現(xiàn)的函數(shù)必須提前注冊(cè)才可以正常的在java世界使用。
- registerZygoteSocket:Zygote在系統(tǒng)中沒有使用Binder而是使用Socket,這個(gè)函數(shù)正式為了建立這個(gè)Socket
- Zygote再?gòu)膕tartSystemServer返回之后會(huì)調(diào)用runSelectLoopMode啟用在registerZygoteSocket中注冊(cè)的socket.
SystemServer進(jìn)程,Zygote生死與共?
- setSignalHandler函數(shù),在Zygoth進(jìn)程forkz子進(jìn)程前調(diào)用,其中設(shè)置了信號(hào)處理函數(shù),在信號(hào)處理函數(shù)中有判斷pid為SystemServer的死亡信號(hào),Zygote會(huì)殺死自己。
- SystemServer進(jìn)程啟動(dòng)后會(huì)關(guān)閉從Zygote那里繼承的socket,與Binder通信系統(tǒng)建立聯(lián)系
SystemServer中運(yùn)行的進(jìn)程公共有六十多種,主要包括:
ActivityManagerService(AMS)
WindowManagerService(WMS)
PackagManagerService(PMS)...;
這些系統(tǒng)服務(wù)都是以一個(gè)線程的方式存在Systemserver進(jìn)程中。
