一 Android系統架構

- Linux內核層(Linux Kernel):Android系統基於Linux2.6內核,這一層為Android設備各種硬件提供了底層驅動,如顯示驅動、音頻驅動、照相機驅動、藍牙驅動、Wi-Fi驅動、電源管理等;
- 硬件抽象層(android hardware abstraction layer):安卓驅動硬件的方式與Linux不盡相同。傳統Linux的驅動完全存活於內核空間。Android則在內核外部增加了硬件抽象層(HAL, Hardware Abstraction Layer),把一部分驅動功能放到HAL層中。安卓為什么費盡麻煩增加一個HAL呢?為了保護源代碼。Linux內核采用了GPL協議,所以硬件生產商想要支持Linux系統,必須遵照GPL協議公開硬件驅動的源代碼。但這些源代碼中包含有許多硬件的設計信息,牽涉到硬件生產商的核心利益。而增加了HAL層之后,硬件廠商就不需要開放所有的驅動代碼了。
- 系統運行庫層(libraries):這一層通過一些C/C++庫(so庫)來為Android系統提供了主要的特性支持。如SQLite庫提供了數據庫支持,OpenGL ES庫提供了3D繪圖支持,Webkit庫提供了瀏覽器內核支持等;
- 應用框架層(application framework):這一層主要提供構建應用程序時可能用到的各種API,Android自帶的一些核心應用就是使用這些API完成的,開發者也可通過使用API來構建自己的應用程序;
- a) Activity Manager(活動管理器)
管理各個應用程序生命周期以及通常的導航回退功能
- b) Window Manager(窗口管理器)
管理所有的窗口程序
- c) Content Provider(內容提供器)
使得不同應用程序之間存取或者分享數據
- d) View System(視圖系統)
構建應用程序的基本組件
- e) Notification Manager(通告管理器)
使得應用程序可以在狀態欄中顯示自定義的提示信息
- f) Package Manager(包管理器)
Android系統內的程序管理
- g)Telephony Manager(電話管理器)
管理所有的移動設備功能
- h)Resource Manager(資源管理器)
提供應用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等
- i)Location Manager(位置管理器)
提供位置服務
- j)XMPP Service(XMPP服務)
提供Google Talk服務
- 應用層(applications):這一層主要用於手機應用的安裝,如系統自帶聯系人、短信等程序,或是第三方應用程序
6.Android運行時庫(Android Runtime)ART以上為五層五區,還有一個區域是存在於libraries層的Android運行時庫(Android Runtime)ART,它主要提供一些核心庫,能夠允許開發者使用Java語言來編寫Android應用。另外Android運行時庫中還包含了Dalvik虛擬機,它使得每一個Android應用都能運行在獨立的進程中,且擁有一個自己的Dalvik虛擬機實例。相較於Java虛擬機,Dalvik是專門為移動設備定制的,它針對手機內存、CPU性能有限等情況作了優化處理。
二 Android系統啟動架構圖

可以看到:Android系統啟動是從下往上的一個過程:Loader->Kernel->Native->Framework->App。
Loader 層
Boot Rom:當手機處於關機狀態時,長按開機鍵開機,會引導芯片開始從固化在Rom里預設的代碼開始執行,然后加載引導程序到Ram.Boot Loader:這是啟動Android系統之前的引導程序,主要是檢查Ram、初始化參數等功能。
Kernel 層
kernel層指的就是Android內核層,到這里才剛剛進入Android系統
- 啟動
Kernel層的swapper進程(pid=0),系統初始化過程Kernel創建的第一個進程,用於初始化進程管理、內存管理,加載Display、Camera、Binder等驅動相關工作。 - 啟動
kthreadd(pid=2),這是Linux系統的內核進程,會創建內核工作線程kworkder、軟中斷線程ksoftirqd和thermal等內核守護進程。kthreadd是所有內核進程的鼻祖。
Native 層
這里的Native層主要包括init孵化來的用戶空間的守護進程、HAL層及開機動畫等。啟動init進程(pid=1),是Linux系統的用戶進程,init進程是所有用戶進程的鼻祖。
init進程會孵化出ueventd、logd、healthd、installd、adbd、lmkd等用戶守護進程;init進程還會啟動ServiceManager(Binder服務管家)、bootanim(開機動畫)等重要服務。init進程孵化出Zygote進程,Zygote進程是Android系統第一個Java進程(虛擬機進程),zygote進程是所有Java進程的父進程。
Framework 層
framework主要包括Zygote進程、SystemServer進程和MediaServer進程`。
Zygote 進程
Zygote進程是由init進程通過解析init.rc文件后fork生成的。Zygote的任務主要包括:
- 加載
ZygoteInit類,注冊Zygote Socket服務端套接字。 - 加載虛擬機
preloadClasssespreloadResources
System Server 進程
System Server進程是由Zygote進程fork而來,System Server是Zygote孵化的第一個進程。System Server負責啟動和管理整個Java Framework,包含ActivityManager、PowerManager等服務。
Media Server 進程
Media Server 進程由init進程fork而來,負責管理整個C++ Framework,包含AudioFlinger、Camera Service等服務。
App 層
Zygote進程孵化出的第一個App進程是Launcher,也就是用戶看到的桌面App。同時Zygote進程還會創建Browser、Phone、Email等App進程。也就是說所有的App進程都是由Zygote進程fork生成的。
Syscall 和 JNI
Native層和Kernel層有一個系統調用層,也就是Syscall。Java層和native層之間的紐帶是JNI。
