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

前言

技術(shù)博客終于可以恢復(fù)正常的更新速度了宫莱,原因是我編寫的進(jìn)階書(shū)籍的初稿已經(jīng)完成,竊以為它將會(huì)是Android應(yīng)用書(shū)籍中最有深度的一本涨椒,可以說(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)架構(gòu)分為五層律歼,從上到下依次是應(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)行直接交互畔况,通常都是用Java進(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)http://androidxref.com/來(lái)閱讀系統(tǒng)源碼墓臭。當(dāng)然,最好是將源碼下載下來(lái)妖谴。下載源碼可以使用清華大學(xué)開(kāi)源軟件鏡像站提供的Android 鏡像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 窿锉。如果覺(jué)得麻煩也可以查找國(guó)內(nèi)的網(wǎng)盤進(jìn)行下載,推薦使用該百度網(wǎng)盤地址下載:http://pan.baidu.com/s/1ngsZs窖维,它提供了多個(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)。


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

enter image description here

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倔幼,一起剝皮案震驚了整個(gè)濱河市盖腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌损同,老刑警劉巖翩腐,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異揖庄,居然都是意外死亡栗菜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蹄梢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疙筹,“玉大人,你說(shuō)我怎么就攤上這事禁炒《兀” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵幕袱,是天一觀的道長(zhǎng)暴备。 經(jīng)常有香客問(wèn)我,道長(zhǎng)们豌,這世上最難降的妖魔是什么涯捻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任浅妆,我火速辦了婚禮,結(jié)果婚禮上障癌,老公的妹妹穿的比我還像新娘凌外。我一直安慰自己,他們只是感情好涛浙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布康辑。 她就那樣靜靜地躺著,像睡著了一般轿亮。 火紅的嫁衣襯著肌膚如雪疮薇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天我注,我揣著相機(jī)與錄音按咒,去河邊找鬼。 笑死但骨,一個(gè)胖子當(dāng)著我的面吹牛胖齐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗽冒,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呀伙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了添坊?” 一聲冷哼從身側(cè)響起剿另,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贬蛙,沒(méi)想到半個(gè)月后雨女,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阳准,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年氛堕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野蝇。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讼稚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绕沈,到底是詐尸還是另有隱情锐想,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布乍狐,位于F島的核電站赠摇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藕帜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一烫罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洽故,春花似錦嗡髓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浊伙。三九已至撞秋,卻和暖如春舶治,著一層夾襖步出監(jiān)牢的瞬間鬓长,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工呻右, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哑子,地道東北人舅列。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卧蜓,于是被迫代替她去往敵國(guó)和親帐要。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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