天天看點

Android系統啟動過程分析Android系統架構系統啟動流程

Android系統架構

Android系統啟動過程分析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系統啟動過程分析Android系統架構系統啟動流程

系統啟動流程

系統啟動架構圖

Android系統啟動過程分析Android系統架構系統啟動流程

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 作業系統架構開篇

Android系統整體架構

Android系統構架及Native Crash

Android圖形系統(十)-SurfaceFlinger啟動及圖層合成送顯過程

Android 顯示系統:SurfaceFlinger詳解

https://www.androidos.net.cn/android/9.0.0_r8/xref/system/core/rootdir/init.rc