1. Android系統(tǒng)架構
Android系統(tǒng)架構分為五層:從上到下依次是應用層滋觉、應用架構層豌熄、系統(tǒng)運行庫層、硬件抽象層和Linux內核層气忠,如圖:
1. 應用層(System Apps)
系統(tǒng)內置的應用程序以及非系統(tǒng)級的應用程序都屬于應用層,負責與用戶進行直接交互赋咽,通常都是用Java進行開發(fā)的旧噪。
2. 應用框架層(Java API Framework)
應用框架層為開發(fā)人員提供了開發(fā)應用程序所需要的API,我們平常開發(fā)應用程序都是調用這一層所提供的API脓匿,當然也包括系統(tǒng)應用舌菜。這一層是由Java代碼編寫的,可以稱為Java Framework亦镶。下面來看這一層所提供的主要組件:
名稱 | 功能描述 |
---|---|
Activity Manager(活動管理器) | 管理各個應用程序生命周期日月,以及常用的導航回退功能 |
Location Manager(位置管理器) | 提供地理位置及定位功能服務 |
Package Manager(包管理器) | 管理所有安裝在Android系統(tǒng)中的應用程序 |
Notification Manager(通知管理器) | 使得應用程序可以在狀態(tài)欄中顯示自定義的提示信息 |
Resource Manager(資源管理器) | 提供應用程序使用的各種非代碼資源,如本地化字符串缤骨、圖片爱咬、布局文件、顏色文件等 |
Telephony Manager(電話管理器) | 管理所有的移動設備功能 |
Window Manager(窗口管理器) | 管理所有開啟的窗口程序 |
Content Provider(內容提供者) | 使得不同應用程序之間可以共享數(shù)據 |
View System(視圖系統(tǒng)) | 構建應用程序的基本組件 |
3. 系統(tǒng)運行庫層
從Android系統(tǒng)框架圖上可以看出绊起,系統(tǒng)運行庫層分為兩部分精拟,分別是 C/C++ 程序庫和 Android 運行時庫,下面分別進行介紹:
(1)C/C++程序庫
名稱 | 功能描述 |
---|---|
OpenGL ES | 3D繪圖函數(shù)庫 |
Libc | 從BSD繼承來的標準C系統(tǒng)函數(shù)庫虱歪,專門為基于嵌入式Linux的設備定制 |
Media Framework | 多媒體庫蜂绎,支持多種常用的音頻、視頻格式錄制和回放笋鄙。 |
SQLite | 輕型的關系型數(shù)據庫引擎 |
SGL | 底層的2D圖形渲染引擎 |
SSL | 安全套接層师枣,是為網絡通信提供安全及數(shù)據完整性的一種安全協(xié)議 |
FreeType | 可移植的字體引擎,它提供統(tǒng)一的接口來訪問多種字體格式文件 |
(2)Android運行時庫
運行時庫又分為核心庫和ART(5.0系統(tǒng)之后萧落,Dalvik虛擬機被ART取代)践美。核心庫提供了Java語言核心庫的大多數(shù)功能,這樣開發(fā)者可以使用Java語言來編寫Android應用找岖。相較于JVM陨倡,Dalvik虛擬機是專門為移動設備定制的,允許在有限的內存中同時運行多個虛擬機的實例许布,并且每一個Dalvik 應用作為一個獨立的Linux 進程執(zhí)行兴革。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。而替代Dalvik虛擬機的ART 的機制與Dalvik 不同蜜唾。在Dalvik下杂曲,應用每次運行的時候箕昭,字節(jié)碼都需要通過即時編譯器轉換為機器碼,這會拖慢應用的運行效率解阅,而在ART 環(huán)境中落竹,應用在第一次安裝的時候,字節(jié)碼就會預先編譯成機器碼货抄,使其成為真正的本地應用述召。
硬件抽象層(HAL)
硬件抽象層是位于操作系統(tǒng)內核與硬件電路之間的接口層,其目的在于將硬件抽象化蟹地,為了保護硬件廠商的知識產權积暖,它隱藏了特定平臺的硬件接口細節(jié),為操作系統(tǒng)提供虛擬硬件平臺怪与,使其具有硬件無關性夺刑,可在多種平臺上進行移植。 從軟硬件測試的角度來看分别,軟硬件的測試工作都可分別基于硬件抽象層來完成遍愿,使得軟硬件測試工作的并行進行成為可能。通俗來講耘斩,就是將控制硬件的動作放在硬件抽象層中沼填。
Linux內核層
Android 的核心系統(tǒng)服務基于Linux 內核,在此基礎上添加了部分Android專用的驅動括授。系統(tǒng)的安全性坞笙、內存管理、進程管理荚虚、網絡協(xié)議棧和驅動模型等都依賴于該內核薛夜。
Android系統(tǒng)的五層架構就講到這,了解以上的知識對以后分析系統(tǒng)源碼有很大的幫助版述。
2. Android系統(tǒng)源碼目錄
我們要先了解Android系統(tǒng)源碼目錄梯澜,為后期源碼學習打下基礎。關于源碼的閱讀院水,推薦使用該百度網盤地址下載:https://pan.baidu.com/s/1d3WtXW7BrmaLGo2bl6lyPA腊徙,它提供了多個Android版本的的源碼下載简十。
整體結構
各個版本的源碼目錄基本是類似檬某,如果是編譯后的源碼目錄會多增加一個out文件夾,用來存儲編譯產生的文件螟蝙。Android7.0的根目錄結構說明如下表所示恢恼。
Android源碼根目錄 | 描述 |
---|---|
abi | 應用程序二進制接口 |
art | 全新的ART運行環(huán)境 |
bionic | 系統(tǒng)C庫 |
bootable | 啟動引導相關代碼 |
build | 存放系統(tǒng)編譯規(guī)則及generic等基礎開發(fā)包配置 |
cts | Android兼容性測試套件標準 |
dalvik | dalvik虛擬機 |
developers | 開發(fā)者目錄 |
development | 應用程序開發(fā)相關 |
device | 設備相關配置 |
docs | 參考文檔目錄 |
external | 開源模組相關文件 |
frameworks | 應用程序框架,Android系統(tǒng)核心部分胰默,由Java和C++編寫 |
hardware | 主要是硬件抽象層的代碼 |
libcore | 核心庫相關文件 |
libnativehelper | 動態(tài)庫场斑,實現(xiàn)JNI庫的基礎 |
ndk | NDK相關代碼漓踢,幫助開發(fā)人員在應用程序中嵌入C/C++代碼 |
out | 編譯完成后代碼輸出在此目錄 |
packages | 應用程序包 |
pdk | Plug Development Kit 的縮寫,本地開發(fā)套件 |
platform_testing | 平臺測試 |
prebuilts | x86和arm架構下預編譯的一些資源 |
sdk | sdk和模擬器 |
system | 底層文件系統(tǒng)庫漏隐、應用和組件 |
toolchain | 工具鏈文件 |
tools | 工具文件 |
Makefile | 全局Makefile文件喧半,用來定義編譯規(guī)則 |
可以看出,系統(tǒng)源碼分類清晰青责,并且內容龐大且復雜挺据。接下來分析packages中的內容,也就是應用層部分
應用層部分
應用層位于整個Android系統(tǒng)的最上層脖隶,開發(fā)者開發(fā)的應用程序以及系統(tǒng)內置的應用程序都是在應用層扁耐。源碼根目錄中的packages目錄對應著系統(tǒng)應用層。它的目錄結構如表
packages目錄 | 描述 |
---|---|
apps | 核心應用程序 |
experimental | 第三方應用程序 |
inputmethods | 輸入法目錄 |
providers | 內容提供者目錄 |
screensavers | 屏幕保護 |
services | 通信服務 |
wallpapers | 墻紙 |
從目錄結構可以發(fā)現(xiàn)产阱,packages目錄存放著系統(tǒng)核心應用程序婉称、第三方的應用程序和輸入法等等,這些應用都是運行在系統(tǒng)應用層的构蹬,因此packages目錄對應著系統(tǒng)的應用層王暗。
應用框架層部分
應用框架層是系統(tǒng)的核心部分,一方面向上提供接口給應用層調用庄敛,另一方面向下與C/C++程序庫以及硬件抽象層等進行銜接瘫筐。 應用框架層的主要實現(xiàn)代碼在/frameworks/base和/frameworks/av目錄下,其中/frameworks/base目錄結構如表
/frameworks/base目錄 | 描述 |
---|---|
api | 定義API |
cmds | 重要命令:am铐姚、app_proce等 |
core | 核心庫 |
data | 字體和聲音等數(shù)據文件 |
docs | 文檔 |
graphics | 圖形圖像相關 |
include | 頭文件 |
keystore | 和數(shù)據簽名證書相關 |
libs | 庫 |
location | 地理位置相關庫 |
media | 多媒體相關庫 |
native | 本地庫 |
nfc-extras | NFC相關 |
obex | 藍牙傳輸 |
opengl | 2D/3D 圖形API |
packages | 設置策肝、TTS、VPN程序 |
sax | XML解析器 |
services | 系統(tǒng)服務 |
telephony | 電話通訊管理 |
test-runner | 測試工具相關 |
tests | 測試相關 |
tools | 工具 |
wifi | wifi無線網絡 |
C/C++程序庫部分
系統(tǒng)運行庫層(Native)中的 C/C++程序庫的類型繁多隐绵,功能強大之众,C/C++程序庫并不完全在一個目錄中,這里給出幾個常用且比較重要的C/C++程序庫所在的目錄位置依许。
目錄位置 | 描述 |
---|---|
bionic/ | Google開發(fā)的系統(tǒng)C庫棺禾,以BSD許可形式開源。 |
/frameworks/av/media | 系統(tǒng)媒體庫 |
/frameworks/native/opengl | 第三方圖形渲染庫 |
/frameworks/native/services/surfaceflinger | 圖形顯示庫峭跳,主要負責圖形的渲染膘婶、疊加和繪制等功能 |
external/sqlite | 輕量型關系數(shù)據庫SQLite的C++實現(xiàn) |
講完 C/C++程序庫部分,剩下的部分我們已經給出:Android運行時庫的代碼放在art/目錄中蛀醉。硬件抽象層的代碼在hardware/目錄中悬襟,這一部分是手機廠商改動最大的一部分,根據手機終端所采用的硬件平臺會有不同的實現(xiàn)拯刁。
3. 源碼閱讀
系統(tǒng)源碼的閱讀有很多種方式脊岳,總的來說分為兩種:
(1)在線閱讀
推薦兩個在線閱讀的網站:http://androidxref.com/ 和 https://www.androidos.net.cn/sourcecode
(2)Source Insight
下載網址:https://www.sourceinsight.com/download/