前言
技術(shù)博客終于可以恢復(fù)正常的更新速度了,原因是我編寫的進(jìn)階書籍的初稿已經(jīng)完成,竊以為它將會是Android應(yīng)用書籍中最有深度的一本,可以說是《Android開發(fā)藝術(shù)探索》的姊妹篇。在這本書的最后一章我會分析Android底層源碼,但是畢竟是一本Android應(yīng)用開發(fā)的書,對于底層源碼閱讀也只能帶大家入個門。因此,在博客中我會新開一個“系統(tǒng)源碼解析”的系列,該系列的開篇就是本篇文章。
1.Android系統(tǒng)架構(gòu)
Android系統(tǒng)架構(gòu)分為五層,從上到下依次是應(yīng)用層、應(yīng)用框架層、系統(tǒng)運(yùn)行庫層、硬件抽象層和Linux內(nèi)核層。
應(yīng)用層
系統(tǒng)內(nèi)置的應(yīng)用程序以及非系統(tǒng)級的應(yīng)用程序都是屬于應(yīng)用層。負(fù)責(zé)與用戶進(jìn)行直接交互,通常都是用Java進(jìn)行開發(fā)的。
應(yīng)用框架層(Java Framework)
應(yīng)用框架層為開發(fā)人員提供了可以開發(fā)應(yīng)用程序所需要的API,我們平常開發(fā)應(yīng)用程序都是調(diào)用的這一層所提供的API,當(dāng)然也包括系統(tǒng)的應(yīng)用。這一層的是由Java代碼編寫的,可以稱為Java Framework。下面來看這一層所提供的主要的組件。
| 名稱 | 功能描述 |
|---|---|
| Activity Manager(活動管理器) | 管理各個應(yīng)用程序生命周期以及通常的導(dǎo)航回退功能 |
| Location Manager(位置管理器) | 提供地理位置以及定位功能服務(wù) |
| Package Manager(包管理器) | 管理所有安裝在Android系統(tǒng)中的應(yīng)用程序 |
| Notification Manager(通知管理器) | 使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息 |
| Resource Manager(資源管理器) | 提供應(yīng)用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等 |
| Telephony Manager(電話管理器) | 管理所有的移動設(shè)備功能 |
| Package Manager(包管理器) | 管理所有安裝在Android系統(tǒng)中的應(yīng)用程序 |
| Window Manager(窗口管理器) | 管理所有開啟的窗口程序 |
| Content Providers(內(nèi)容提供器) | 使得不同應(yīng)用程序之間可以共享數(shù)據(jù) |
| View System(視圖系統(tǒng)) | 構(gòu)建應(yīng)用程序的基本組件 |
表1
系統(tǒng)運(yùn)行庫層(Native)
系統(tǒng)運(yùn)行庫層分為兩部分,分別是C/C++程序庫和Android運(yùn)行時(shí)庫。下面分別來介紹它們。
1.C/C++程序庫
C/C++程序庫能被Android系統(tǒng)中的不同組件所使用,并通過應(yīng)用程序框架為開發(fā)者提供服務(wù),主要的C/C++程序庫如下表2所示。
| 名稱 | 功能描述 |
|---|---|
| OpenGL ES | 3D繪圖函數(shù)庫 |
| Libc | 從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫,專門為基于嵌入式Linux的設(shè)備定制 |
| Media Framework | 多媒體庫,支持多種常用的音頻、視頻格式錄制和回放。 |
| SQLite | 輕型的關(guān)系型數(shù)據(jù)庫引擎 |
| SGL | 底層的2D圖形渲染引擎 |
| SSL | 安全套接層,是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議 |
| FreeType | 可移植的字體引擎,它提供統(tǒng)一的接口來訪問多種字體格式文件 |
表2
2.Android運(yùn)行時(shí)庫
運(yùn)行時(shí)庫又分為核心庫和ART(5.0系統(tǒng)之后,Dalvik虛擬機(jī)被ART取代)。核心庫提供了Java語言核心庫的大多數(shù)功能,這樣開發(fā)者可以使用Java語言來編寫Android應(yīng)用。相較于JVM,Dalvik虛擬機(jī)是專門為移動設(shè)備定制的,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個虛擬機(jī)的實(shí)例,并且每一個Dalvik 應(yīng)用作為一個獨(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ī)器碼,這會拖慢應(yīng)用的運(yùn)行效率,而在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會預(yù)先編譯成機(jī)器碼,使其成為真正的本地應(yīng)用。
硬件抽象層(HAL)
硬件抽象層是位于操作系統(tǒng)內(nèi)核與硬件電路之間的接口層,其目的在于將硬件抽象化,為了保護(hù)硬件廠商的知識產(chǎn)權(quán),它隱藏了特定平臺的硬件接口細(xì)節(jié),為操作系統(tǒng)提供虛擬硬件平臺,使其具有硬件無關(guān)性,可在多種平臺上進(jìn)行移植。 從軟硬件測試的角度來看,軟硬件的測試工作都可分別基于硬件抽象層來完成,使得軟硬件測試工作的并行進(jìn)行成為可能。通俗來講,就是將控制硬件的動作放在硬件抽象層中。
Linux內(nèi)核層
Android 的核心系統(tǒng)服務(wù)基于Linux 內(nèi)核,在此基礎(chǔ)上添加了部分Android專用的驅(qū)動。系統(tǒng)的安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動模型等都依賴于該內(nèi)核。
Android系統(tǒng)的五層架構(gòu)就講到這,了解以上的知識對以后分析系統(tǒng)源碼有很大的幫助。
2.Android系統(tǒng)源碼目錄
我們要先了解Android系統(tǒng)源碼目錄,為后期源碼學(xué)習(xí)打下基礎(chǔ)。關(guān)于源碼的閱讀,你可以訪問http://androidxref.com/來閱讀系統(tǒng)源碼。當(dāng)然,最好是將源碼下載下來。下載源碼可以使用清華大學(xué)開源軟件鏡像站提供的Android 鏡像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。如果覺得麻煩也可以查找國內(nèi)的網(wǎng)盤進(jìn)行下載,推薦使用該百度網(wǎng)盤地址下載:http://pan.baidu.com/s/1ngsZs,它提供了多個Android版本的的源碼下載。
整體結(jié)構(gòu)
各個版本的源碼目錄基本是類似,如果是編譯后的源碼目錄會多增加一個out文件夾,用來存儲編譯產(chǎn)生的文件。Android7.0的根目錄結(jié)構(gòu)說明如下表所示。
| Android源碼根目錄 | 描述 |
|---|---|
| abi | 應(yīng)用程序二進(jìn)制接口 |
| art | 全新的ART運(yùn)行環(huán)境 |
| bionic | 系統(tǒng)C庫 |
| bootable | 啟動引導(dǎo)相關(guān)代碼 |
| build | 存放系統(tǒng)編譯規(guī)則及generic等基礎(chǔ)開發(fā)包配置 |
| cts | Android兼容性測試套件標(biāo)準(zhǔn) |
| dalvik | dalvik虛擬機(jī) |
| developers | 開發(fā)者目錄 |
| development | 應(yīng)用程序開發(fā)相關(guān) |
| device | 設(shè)備相關(guān)配置 |
| docs | 參考文檔目錄 |
| external | 開源模組相關(guān)文件 |
| frameworks | 應(yīng)用程序框架,Android系統(tǒng)核心部分,由Java和C++編寫 |
| hardware | 主要是硬件抽象層的代碼 |
| libcore | 核心庫相關(guān)文件 |
| libnativehelper | 動態(tài)庫,實(shí)現(xiàn)JNI庫的基礎(chǔ) |
| ndk | NDK相關(guān)代碼,幫助開發(fā)人員在應(yīng)用程序中嵌入C/C++代碼 |
| out | 編譯完成后代碼輸出在此目錄 |
| packages | 應(yīng)用程序包 |
| pdk | Plug Development Kit 的縮寫,本地開發(fā)套件 |
| platform_testing | 平臺測試 |
| prebuilts | x86和arm架構(gòu)下預(yù)編譯的一些資源 |
| sdk | 應(yīng)用程序包 |
| packages | sdk和模擬器 |
| system | 底層文件系統(tǒng)庫、應(yīng)用和組件 |
| toolchain | 工具鏈文件 |
| tools | 工具文件 |
| Makefile | 全局Makefile文件,用來定義編譯規(guī)則 |
表3
從表3可以看出,系統(tǒng)源碼分類清晰,并且內(nèi)容龐大且復(fù)雜。接下來分析packages中的內(nèi)容,也就是應(yīng)用層部分。
應(yīng)用層部分
應(yīng)用層位于整個Android系統(tǒng)的最上層,開發(fā)者開發(fā)的應(yīng)用程序以及系統(tǒng)內(nèi)置的應(yīng)用程序都是在應(yīng)用層。源碼根目錄中的packages目錄對應(yīng)著系統(tǒng)應(yīng)用層。它的目錄結(jié)構(gòu)如表4所示。
| packages目錄 | 描述 |
|---|---|
| apps | 核心應(yīng)用程序 |
| experimental | 第三方應(yīng)用程序 |
| inputmethods | 輸入法目錄 |
| providers | 內(nèi)容提供者目錄 |
| screensavers | 屏幕保護(hù) |
| services | 通信服務(wù) |
| wallpapers | 墻紙 |
表4
從目錄結(jié)構(gòu)可以發(fā)現(xiàn),packages目錄存放著系統(tǒng)核心應(yīng)用程序、第三方的應(yīng)用程序和輸入法等等,這些應(yīng)用都是運(yùn)行在系統(tǒng)應(yīng)用層的,因此packages目錄對應(yīng)著系統(tǒng)的應(yīng)用層。
應(yīng)用框架層部分
應(yīng)用框架層是系統(tǒng)的核心部分,一方面向上提供接口給應(yīng)用層調(diào)用,另一方面向下與C/C++程序庫以及硬件抽象層等進(jìn)行銜接。 應(yīng)用框架層的主要實(shí)現(xiàn)代碼在/frameworks/base和/frameworks/av目錄下,其中/frameworks/base目錄結(jié)構(gòu)如表5所示。
| /frameworks/base目錄 | 描述 | /frameworks/base目錄 | 描述 |
|---|---|---|---|
| api | 定義API | cmds | 重要命令:am、app_proce等 |
| core | 核心庫 | data | 字體和聲音等數(shù)據(jù)文件 |
| docs | 文檔 | graphics | 圖形圖像相關(guān) |
| include | 頭文件 | keystore | 和數(shù)據(jù)簽名證書相關(guān) |
| libs | 庫 | location | 地理位置相關(guān)庫 |
| media | 多媒體相關(guān)庫 | native | 本地庫 |
| nfc-extras | NFC相關(guān) | obex | 藍(lán)牙傳輸 |
| opengl | 2D/3D 圖形API | packages | 設(shè)置、TTS、VPN程序 |
| sax | XML解析器 | services | 系統(tǒng)服務(wù) |
| telephony | 電話通訊管理 | test-runner | 測試工具相關(guān) |
| tests | 測試相關(guān) | tools | 工具 |
| wifi | wifi無線網(wǎng)絡(luò) |
表5
C/C++程序庫部分
系統(tǒng)運(yùn)行庫層(Native)中的 C/C++程序庫的類型繁多,功能強(qiáng)大,C/C++程序庫并不完全在一個目錄中,這里給出幾個常用且比較重要的C/C++程序庫所在的目錄位置。
| 目錄位置 | 描述 |
|---|---|
| bionic/ | Google開發(fā)的系統(tǒng)C庫,以BSD許可形式開源。 |
| /frameworks/av/media | 系統(tǒng)媒體庫 |
| /frameworks/native/opengl | 第三方圖形渲染庫 |
| /frameworks/native/services/surfaceflinger | 圖形顯示庫,主要負(fù)責(zé)圖形的渲染、疊加和繪制等功能 |
| external/sqlite | 輕量型關(guān)系數(shù)據(jù)庫SQLite的C++實(shí)現(xiàn) |
表6
講完 C/C++程序庫部分,剩下的部分我們在表3已經(jīng)給出:Android運(yùn)行時(shí)庫的代碼放在art/目錄中。硬件抽象層的代碼在hardware/目錄中,這一部分是手機(jī)廠商改動最大的一部分,根據(jù)手機(jī)終端所采用的硬件平臺會有不同的實(shí)現(xiàn)。
歡迎關(guān)注我的微信公眾號,第一時(shí)間獲得博客更新提醒,以及更多成體系的Android相關(guān)技術(shù)干貨。
掃一掃下方二維碼即可關(guān)注:
