Android 系統(tǒng)

Android系統(tǒng)

11335240-f4923cc40cfd7996.png

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)核。


Android系統(tǒng)進(jìn)程角度-gityuan

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)流程?

啟動(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)程中。

1836169-0d9a175153a9cf03.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容