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