Android系統架構
一、APPLACTIONS(應用程式層)
該層提供一些核心應用程式包,例如主界面,浏覽器,電子郵件、聯系人,短信、月曆、地圖等。同時,開發者可以利用Java語言設計和編寫屬于自己的應用程式。
二、APPLANCTION FRAMEWORK(應用程式架構層)
該層是Android應用開發的基礎,開發人員大部分情況是在和她打交道。應用程式架構層包括 Activity Manager活動管理器、Window Manager視窗管理器、Content Providers内容提供者、View System視圖系統、Notification Manager通知管理器、Package Manager包管理器、Telephony Manager電話管理器、Resource Manager資料總管、Location Manager位置管理器、XMPP Services XMPP服務,一共十個部分。
這一層是API架構,開發人員可以使用這些架構來開發自己的應用,這樣便簡化了程式開發的結構設計,但是必須要遵守其架構的開發原則。
三、LABRARIES(系統庫(C/C++庫))和ANDROID RUNTIME(Android運作時)
1、LABRARIES(系統庫(C/C++庫))
系統庫包括九個子系統,分别是Surface Manager圖層管理、Media Framework媒體庫、SQLite資料庫、OpenGLESate開放圖形庫用來支援3D效果、FreeType位圖和矢量、WebKit浏覽器核心、SGL 2D圖形引擎庫、SSL為資料通信提供支援、libc C語言的函數庫。
2、ANDROID RUNTIME(安卓運作時)
Android運作時包括核心庫(core Labraries)和Dalvik虛拟機(Dalvik Virtual Machine)。
核心庫既相容了大多數Java語言所需要調用的功能函數,又包括了Android的核心庫,比如android.os、android.net、android.media等等。
Dalvik虛拟機是一種基于寄存器的java虛拟機,主要是完成對生命周期的管理、堆棧的管理、線程的管理、安全和異常的管理以及垃圾回收等重要功能
Android運作時:https://source.android.google.cn/devices/architecture/modular-system/runtime?hl=zh-cn
四、Linux Kernel(Linux核心)
提供各種驅動程式,Display Driver 顯示驅動、Camra Driver 攝像頭驅動、Bluetooth Driver 藍牙驅動、Flash Memory Driver 記憶體驅動、Binder Driver Binder驅動、USB Driver、Audio Driver 音頻驅動、Power Managemnet 電源管理、WIFI Driver 無線驅動、Keypad Driver 鍵盤驅動。
Android核心系統服務依賴于Linux核心,如安全性、記憶體管理、程序管理、網絡協定棧和驅動模型。Linux核心也是作為硬體與軟體棧的抽象層。
Google官方提供的新版的經典5層架構圖
系統啟動流程
系統啟動架構圖
Android系統的啟動過程從整體的分層來看:Loader > Kernel > Native > Framework > Application
從細分的程序角度看:BootRom > Bootloader > Kernel > Init > Zygote > SystemServer > Launcher
接來下簡要說說每個過程。
Loader層
Boot ROM: 當手機處于關機狀态時,長按Power鍵開機,引導晶片開始從固化在ROM裡的預設代碼開始執行,然後加載引導程式到RAM;
Boot Loader:這是啟動Android系統之前的引導程式,主要是檢查RAM,初始化硬體參數等功能。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的映射圖,進而将系統的軟硬體環境帶到一個合适的狀态,以便為最終調用作業系統核心準備好正确的環境。
Linux核心層
1.啟動Kernel的swapper程序(pid=0,排程程序):該程序又稱為idle程序,系統初始化過程Kernel由無到有開創的第一個程序,用于初始化程序管理、記憶體管理,加載Camera Driver,Binder Driver,Display Driver,Input Driver等相關工作;
2.swapper程序啟動init程序(pid=1):init程序是Linux系統的第一個使用者空間程序。
3.swapper程序啟動kthreadd程序(pid=2):是Linux系統的核心程序,會建立核心工作程序kworkder,核心軟中斷程序ksoftirqd,thermal等核心守護程序。
對于核心來說,程序的“祖先”是swapper程序(也稱為idle程序);
對于使用者空間來說,程序“祖先”是init程序,所有使用者空間程序都由init程序建立或派生。
Native層
init程序是Linux系統的第一個使用者空間程序,是所有使用者空間程序的“祖先”。
init程序建立servicemanager程序,servicemanager程序管理着Binder程序間通信機制相關服務。
init程序SurfaceFlinger程序,SurfaceFlinger程序管理着Android的視圖顯示系統
init程序建立Zygote程序,Zygote程序是Android系統的第一個Java程序(即虛拟機程序)
init程序建立mediaserver程序,mediaserver程序是android中一個非常重要的程序,音頻,視訊,camera都和該程序有關。
init程序還會建立ueventd、logd、healthd、installd、adbd、lmkd等使用者守護程序;
Framework層
Zygote程序,是由init程序通過解析init.rc檔案後fork生成的,Zygote程序主要包含:
- 啟動Dalvik虛拟機
- 建立本地socket服務
- 預加載系統類和資源
- fork SystemServer程序
zygote是受精卵的意思,它是Android中的一個非常重要的守護程序服務(Daem Service),所有的其他Dalvik虛拟機程序都是通過zygote孵化(fork)出來的。Android應用程式是由Java語言編寫的,運作在各自獨立的Dalvik虛拟機中。如果每個應用程式在啟動之時都需要單獨運作和初始化一個虛拟機,會大大降低系統性能,是以Android首先建立一個zygote虛拟機,然後通過它孵化出其他的虛拟機程序,進而共享虛拟機記憶體和架構層資源,這樣大幅度提高應用程式的啟動和運作速度。
System Server程序是Zygote建立的第一個程序,System Server負責啟動和管理整個Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服務。
App層
Zygote程序孵化出的第一個App程序是Launcher,這是使用者看到的桌面App;
Zygote程序還會建立Browser,Phone,Email等App程序,每個App至少運作在一個程序上。
所有的App程序都是由Zygote程序fork生成的。
總結
參考:
【Android】系統架構
Android啟動流程簡析(一)
Android系統啟動流程
Android 作業系統架構開篇
Android系統整體架構
Android系統構架及Native Crash
Android圖形系統(十)-SurfaceFlinger啟動及圖層合成送顯過程
Android 顯示系統:SurfaceFlinger詳解
https://www.androidos.net.cn/android/9.0.0_r8/xref/system/core/rootdir/init.rc