第 1 章 Android 系統架構
1.1 Android 系統架構
Android 系統架構分爲五層,從上到下依次是應用層、應用框架層、系統運行庫層、硬件抽象層和 Linux 內核層。
-
應用層(System Apps)
系統內置的應用程序以及非系統級的應用程序都屬於應用層,負責與用戶進行直接交互,通常都是用 Java 進行開發的。 -
應用框架層(Java API Framework)
應用框架層爲開發人員提供了開發應用程序所需要的 API,我們平常開發應用程序都是調用這一層所提供的 API,當然也包括系統應用。這一層是由 Java 代碼編寫的,可以稱爲 Java Framework。
名稱 | 功能描述 |
---|---|
Activity Manager(活動管理器) | 管理各個應用程序生命週期,以及常用的導航回退功能 |
Location Manager(位置管理器) | 提供地理位置及定位功能服務 |
Package Manager(包管理器) | 管理所有安裝在 Android 系統中的應用程序 |
Notification Manager(通知管理器) | 使得應用程序可以在狀態欄中顯示自定義的提示信息 |
Resource Manager(資源管理器) | 提供應用程序使用的各種非代碼資源,如本地化字符串、圖片、佈局文件、顏色文件等 |
Telephony Manager(電話管理器) | 管理所有的移動設備功能 |
Window Manager(窗口管理器) | 管理所有開啓的窗口程序 |
Content Provider(內容提供者) | 使得不同應用程序之間可以共享數據 |
View System(視圖系統) | 構建應用程序的基本組件 |
- 系統運行庫層(Native)
系統運行庫層分爲兩部分,分別是 C/C+ + 程序庫和 Android 運行時庫。
1) C/C+ + 程序庫
C/C+ + 程序庫能被 Android 系統中的不同組件所使用,並通過應用程序框架爲開發者提供服務。
主要的 C/C+ + 程序表
名稱 | 功能描述 |
---|---|
OpenGL ES | 3D 繪圖函數庫 |
Libc | 從 BSD 繼承來的標準 C 系統函數庫,專門爲基於嵌入式 Linux 的設備定製 |
Media Framework | 多媒體庫,支持多種常用的音頻、視頻格式錄製和回放 |
SQLite | 輕型的關係型數據庫引擎 |
SGL | 底層的 2D 圖形渲染引擎 |
SSL | 安全套接層,是一種爲網絡通信提供安全及數據完整性的安全協議 |
FreeType | 可移植的字體引擎,它提供統一的接口來訪問多種字體格式文件 |
2)Android 運行時庫
運行時庫又分爲核心庫和 ART (Android 5.0 系統之後,Dalvik 虛擬機被 ART 取代)。核心庫提供了 Java 語言核心庫的大多數功能,這樣開發者可以使用 Java 語言來編寫 Android 應用。與 JVM 相比,Dalvik 虛擬機(DVM)是專門爲移動設備定製的,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個 Dalvik 應用作爲一個獨立的 Linux 進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。而替代 DVM 的 ART 的機制與 DVM 不同,DVM 中的應用每次運行時,自己嗎都需要通過即時編譯器(Just In Time,JIT)轉換爲機器碼,這會使得應用的運行效率降低。而在 ART 中,系統在安裝應用時會進行一次預編譯(Android Of Time,AOT),將字節碼預先編譯成機器碼並存儲在本地,這樣應用每次運行時就不需要執行編譯了,運行效率也大大提高。
-
硬件抽象層(HAL)
硬件抽象層是位於操作系統內核與硬件電路之間的接口層,其目的在於將硬件抽象化,爲了保護硬件廠商的知識產權,它隱藏了特定平臺的硬件接口細節,爲操作系統提供虛擬硬件平臺,使其具有硬件無慣性,可在多種平臺上進行移植。從軟硬件測試的角度來看,軟硬件的測試工作都可分別基於硬件抽象層來完成,使得軟硬件測試工作的並行進行稱爲可能。通俗來講,就是將控制硬件的動作放在硬件抽象層中。 -
Linux 內核層(Linux Kernal)
Android 的核心繫統服務基於 Linux 內核,在此基礎上添加了部分 Android 專用的驅動。系統的安全性、內存管理、進程管理、網絡協議棧和驅動模型等都依賴於該內核。
1.2 Android 系統源碼目錄
可以訪問 http://androidxref.com 來閱讀系統源碼。推薦使用百度網盤地址 http://pan.baidu.com/s/lngsZa 進行下載。
1.2.1 整體結構
如果是編譯後的源碼目錄,會多一個 out 文件夾,用來存儲編譯產生的文件。
Android 8.0.0 的系統根目錄結構說明
Android 源碼根目錄 | 描述 |
---|---|
art | 全新的 ART 運行環境 |
bionic | 系統 C 庫 |
bootable | 啓動引導相關代碼 |
build | 存放系統編譯規則及 generic 等基礎開發包配置 |
cts | Android 兼容性測試套件標準 |
dalvik | Dalvik 虛擬機 |
developers | 開發者目錄 |
development | 與應用程序開發相關 |
device | 設備相關配置 |
docs | 參考文檔目錄 |
external | 開源模組相關文件 |
frameworks | 應用程序框架,Android 系統核心部分,由 Java 和 C++ 編寫 |
hardware | 主要是硬件抽象層的代碼 |
libcore | 核心庫相關文件 |
libnativehelper | 動態庫,實現 JNI 庫的基礎 |
out | 編譯完成後代碼在此目錄輸出 |
pdk | Plug Development Kit 的縮寫,本地開發套件 |
platform_testing | 平臺測試 |
prebuilts | X86 和 ARM 架構下預編譯的一些資源 |
sdk | SDK 和模擬器 |
packages | 應用程序包 |
system | 底層文件系統庫、應用和組件 |
toolchain | 工具鏈文件 |
tools | 工具文件 |
makefile | 全局 Makefile 文件,用來定義編譯規則 |
1.2.2 應用層部分
應用層位於整個 Android 系統的最上層,開發者開發的應用程序以及系統內置的應用程序都在應用層。源碼根目錄中的 packages 目錄對應着系統應用層。
packages 目錄結構
packages 目錄 | 描述 |
---|---|
apps | 核心應用程序 |
experimental | 第三方應用程序 |
inputmethods | 輸入法目錄 |
providers | 內容提供者目錄 |
screensavers | 屏幕保護 |
services | 通信服務 |
wallpapers | 牆紙 |
1.2.3 應用框架部分
應用框架層是系統的核心部分,一方面向上提供接口給應用層調用,另一方面向下與 C/C++ 程序庫及硬件抽象層等進行銜接。應用框架層的主要實現代碼在 framework/base 和 frameworks/av 目錄下。
frameworks/base 目錄
frameworks/base 目錄 | 描述 | frameworks/base 目錄 | 描述 |
---|---|---|---|
api | 定義 API | cmds | 重要命令:am、app_proce 等 |
core | 核心庫 | data | 字體和聲音等數據文件 |
docs | 文檔 | graphics | 與圖形圖像相關 |
include | 頭文件 | keystore | 與數據簽名證書相關 |
libs | 庫 | location | 地理位置相關庫 |
media | 多媒體相關庫 | native | 本地庫 |
nfc-extras | 與 NFC 相關 | obex | 藍牙傳輸 |
opengl | 2D/3D 圖形 API | packages | 設置、TTS、VPN 程序 |
sax | XML 解析器 | services | 系統服務 |
telephony | 電話通信管理 | test-runner | 測試工具相關 |
tests | 與測試相關 | tools | 工具 |
vr | 與 VR 相關 | wifi | Wi-Fi 無限網絡 |
1.2.4 C/C++ 程序庫部分
系統運行庫層(Native)中的 C/C 程序庫的類型繁多,功能強大,C/C 程序庫並不完全在一個目錄中。
C/C++ 程序庫所在的目錄位置
目錄位置 | 描述 |
---|---|
bionic | Google 開發的系統 C 庫,以 BSD 許可形式開源 |
frameworks/av/media | 系統媒體庫 |
frameworks/native/opengl | 第三方圖形渲染庫 |
frameworks/native/services/surfaceflinger | 圖形顯示庫,主要負責圖形的渲染、疊加和繪製等功能 |
external/sqlite | 輕量級關係型數據庫 SQLite 的 C++ 實現 |
Android 運行時庫的代碼在 art/目錄中,硬件抽象層的代碼在 hardware/目錄中,這是手機廠商改動最大的部分,根據手機終端鎖採用的硬件平臺不同會有不同的實現。
1.3 源碼閱讀
系統源碼的閱讀有很多種方式,總的來說分爲兩種:一種是在線閱讀;另一種是下載源碼到本地用軟件工具閱讀。
1.3.1 在線閱讀
Android 在西安閱讀源碼的網站有很多,比如 http://www.grepcode.com、http://androidxref.com、http://www.androidos.cn 等,推薦使用 http://androidxref.com 進行在線閱讀,網站提供了 Android 1.6 到 Android 8.0.0 的源碼。
1.3.2 使用 Source Insight
本地閱讀源碼可以採用 Android Studio、Eclipse、Sublime 和 Source Insight 等軟件,這裏推薦使用 Source Insight。