Android系統(tǒng)架構(gòu)與系統(tǒng)源碼目錄

前言

技術(shù)博客終于可以恢復正常的更新速度了,原因是我編寫的進階書籍的初稿已經(jīng)完成,竊以為它將會是Android應用書籍中最有深度的一本,可以說是《Android開發(fā)藝術(shù)探索》的姊妹篇。在這本書的最后一章我會分析Android底層源碼,但是畢竟是一本Android應用開發(fā)的書,對于底層源碼閱讀也只能帶大家入個門。因此,在博客中我會新開一個“系統(tǒng)源碼解析”的系列,該系列的開篇就是本篇文章。

1.Android系統(tǒng)架構(gòu)

Android系統(tǒng)架構(gòu)分為五層,從上到下依次是應用層、應用框架層、系統(tǒng)運行庫層、硬件抽象層和Linux內(nèi)核層。


這里寫圖片描述

應用層

系統(tǒng)內(nèi)置的應用程序以及非系統(tǒng)級的應用程序都是屬于應用層。負責與用戶進行直接交互,通常都是用Java進行開發(fā)的。

應用框架層(Java Framework)

應用框架層為開發(fā)人員提供了可以開發(fā)應用程序所需要的API,我們平常開發(fā)應用程序都是調(diào)用的這一層所提供的API,當然也包括系統(tǒng)的應用。這一層的是由Java代碼編寫的,可以稱為Java Framework。下面來看這一層所提供的主要的組件。

名稱 功能描述
Activity Manager(活動管理器) 管理各個應用程序生命周期以及通常的導航回退功能
Location Manager(位置管理器) 提供地理位置以及定位功能服務
Package Manager(包管理器) 管理所有安裝在Android系統(tǒng)中的應用程序
Notification Manager(通知管理器) 使得應用程序可以在狀態(tài)欄中顯示自定義的提示信息
Resource Manager(資源管理器) 提供應用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等
Telephony Manager(電話管理器) 管理所有的移動設備功能
Package Manager(包管理器) 管理所有安裝在Android系統(tǒng)中的應用程序
Window Manager(窗口管理器) 管理所有開啟的窗口程序
Content Providers(內(nèi)容提供器) 使得不同應用程序之間可以共享數(shù)據(jù)
View System(視圖系統(tǒng)) 構(gòu)建應用程序的基本組件

表1

系統(tǒng)運行庫層(Native)

系統(tǒng)運行庫層分為兩部分,分別是C/C++程序庫和Android運行時庫。下面分別來介紹它們。

1.C/C++程序庫

C/C++程序庫能被Android系統(tǒng)中的不同組件所使用,并通過應用程序框架為開發(fā)者提供服務,主要的C/C++程序庫如下表2所示。

名稱 功能描述
OpenGL ES 3D繪圖函數(shù)庫
Libc 從BSD繼承來的標準C系統(tǒng)函數(shù)庫,專門為基于嵌入式Linux的設備定制
Media Framework 多媒體庫,支持多種常用的音頻、視頻格式錄制和回放。
SQLite 輕型的關(guān)系型數(shù)據(jù)庫引擎
SGL 底層的2D圖形渲染引擎
SSL 安全套接層,是為網(wǎng)絡通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議
FreeType 可移植的字體引擎,它提供統(tǒng)一的接口來訪問多種字體格式文件

表2

2.Android運行時庫

運行時庫又分為核心庫和ART(5.0系統(tǒng)之后,Dalvik虛擬機被ART取代)。核心庫提供了Java語言核心庫的大多數(shù)功能,這樣開發(fā)者可以使用Java語言來編寫Android應用。相較于JVM,Dalvik虛擬機是專門為移動設備定制的,允許在有限的內(nèi)存中同時運行多個虛擬機的實例,并且每一個Dalvik 應用作為一個獨立的Linux 進程執(zhí)行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關(guān)閉。而替代Dalvik虛擬機的ART 的機制與Dalvik 不同。在Dalvik下,應用每次運行的時候,字節(jié)碼都需要通過即時編譯器轉(zhuǎn)換為機器碼,這會拖慢應用的運行效率,而在ART 環(huán)境中,應用在第一次安裝的時候,字節(jié)碼就會預先編譯成機器碼,使其成為真正的本地應用。

硬件抽象層(HAL)

硬件抽象層是位于操作系統(tǒng)內(nèi)核與硬件電路之間的接口層,其目的在于將硬件抽象化,為了保護硬件廠商的知識產(chǎn)權(quán),它隱藏了特定平臺的硬件接口細節(jié),為操作系統(tǒng)提供虛擬硬件平臺,使其具有硬件無關(guān)性,可在多種平臺上進行移植。 從軟硬件測試的角度來看,軟硬件的測試工作都可分別基于硬件抽象層來完成,使得軟硬件測試工作的并行進行成為可能。通俗來講,就是將控制硬件的動作放在硬件抽象層中。

Linux內(nèi)核層

Android 的核心系統(tǒng)服務基于Linux 內(nèi)核,在此基礎上添加了部分Android專用的驅(qū)動。系統(tǒng)的安全性、內(nèi)存管理、進程管理、網(wǎng)絡協(xié)議棧和驅(qū)動模型等都依賴于該內(nèi)核。
Android系統(tǒng)的五層架構(gòu)就講到這,了解以上的知識對以后分析系統(tǒng)源碼有很大的幫助。

2.Android系統(tǒng)源碼目錄

我們要先了解Android系統(tǒng)源碼目錄,為后期源碼學習打下基礎。關(guān)于源碼的閱讀,你可以訪問http://androidxref.com/來閱讀系統(tǒng)源碼。當然,最好是將源碼下載下來。下載源碼可以使用清華大學開源軟件鏡像站提供的Android 鏡像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。如果覺得麻煩也可以查找國內(nèi)的網(wǎng)盤進行下載,推薦使用該百度網(wǎng)盤地址下載:http://pan.baidu.com/s/1ngsZs,它提供了多個Android版本的的源碼下載。

整體結(jié)構(gòu)

各個版本的源碼目錄基本是類似,如果是編譯后的源碼目錄會多增加一個out文件夾,用來存儲編譯產(chǎn)生的文件。Android7.0的根目錄結(jié)構(gòu)說明如下表所示。

Android源碼根目錄 描述
abi 應用程序二進制接口
art 全新的ART運行環(huán)境
bionic 系統(tǒng)C庫
bootable 啟動引導相關(guān)代碼
build 存放系統(tǒng)編譯規(guī)則及generic等基礎開發(fā)包配置
cts Android兼容性測試套件標準
dalvik dalvik虛擬機
developers 開發(fā)者目錄
development 應用程序開發(fā)相關(guān)
device 設備相關(guān)配置
docs 參考文檔目錄
external 開源模組相關(guān)文件
frameworks 應用程序框架,Android系統(tǒng)核心部分,由Java和C++編寫
hardware 主要是硬件抽象層的代碼
libcore 核心庫相關(guān)文件
libnativehelper 動態(tài)庫,實現(xiàn)JNI庫的基礎
ndk NDK相關(guān)代碼,幫助開發(fā)人員在應用程序中嵌入C/C++代碼
out 編譯完成后代碼輸出在此目錄
packages 應用程序包
pdk Plug Development Kit 的縮寫,本地開發(fā)套件
platform_testing 平臺測試
prebuilts x86和arm架構(gòu)下預編譯的一些資源
sdk 應用程序包
packages sdk和模擬器
system 底層文件系統(tǒng)庫、應用和組件
toolchain 工具鏈文件
tools 工具文件
Makefile 全局Makefile文件,用來定義編譯規(guī)則

表3
從表3可以看出,系統(tǒng)源碼分類清晰,并且內(nèi)容龐大且復雜。接下來分析packages中的內(nèi)容,也就是應用層部分。

應用層部分

應用層位于整個Android系統(tǒng)的最上層,開發(fā)者開發(fā)的應用程序以及系統(tǒng)內(nèi)置的應用程序都是在應用層。源碼根目錄中的packages目錄對應著系統(tǒng)應用層。它的目錄結(jié)構(gòu)如表4所示。

packages目錄 描述
apps 核心應用程序
experimental 第三方應用程序
inputmethods 輸入法目錄
providers 內(nèi)容提供者目錄
screensavers 屏幕保護
services 通信服務
wallpapers 墻紙

表4

從目錄結(jié)構(gòu)可以發(fā)現(xiàn),packages目錄存放著系統(tǒng)核心應用程序、第三方的應用程序和輸入法等等,這些應用都是運行在系統(tǒng)應用層的,因此packages目錄對應著系統(tǒng)的應用層。

應用框架層部分

應用框架層是系統(tǒng)的核心部分,一方面向上提供接口給應用層調(diào)用,另一方面向下與C/C++程序庫以及硬件抽象層等進行銜接。 應用框架層的主要實現(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 藍牙傳輸
opengl 2D/3D 圖形API packages 設置、TTS、VPN程序
sax XML解析器 services 系統(tǒng)服務
telephony 電話通訊管理 test-runner 測試工具相關(guān)
tests 測試相關(guān) tools 工具
wifi wifi無線網(wǎng)絡

表5

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 輕量型關(guān)系數(shù)據(jù)庫SQLite的C++實現(xiàn)

表6
講完 C/C++程序庫部分,剩下的部分我們在表3已經(jīng)給出:Android運行時庫的代碼放在art/目錄中。硬件抽象層的代碼在hardware/目錄中,這一部分是手機廠商改動最大的一部分,根據(jù)手機終端所采用的硬件平臺會有不同的實現(xiàn)。


歡迎關(guān)注我的微信公眾號,第一時間獲得博客更新提醒,以及更多成體系的Android相關(guān)技術(shù)干貨。
掃一掃下方二維碼即可關(guān)注:

enter image description here

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內(nèi)容