Android采用了分層架構(gòu)借尿,從上圖的架構(gòu)圖中我們可以知道,Android劃分了四個(gè)層矛物,由高到低分別是應(yīng)用程序?qū)用K溃瑧?yīng)用程序框架層,運(yùn)行庫(kù)層履羞,Linux內(nèi)核層峦萎。其中藍(lán)色代表Java程序屡久,黃色代表Java虛擬機(jī),綠色代表C/C++編寫(xiě)的程序庫(kù)爱榔,紅色為內(nèi)核(內(nèi)核+驅(qū)動(dòng))被环。
1.應(yīng)用程序?qū)樱↗AVA應(yīng)用程序)
應(yīng)用程序?qū)影覀兂R?jiàn)的Android應(yīng)用程序,例如通訊錄详幽,聯(lián)系人筛欢,瀏覽器等。
2.應(yīng)用程序框架層(JAVA框架)
來(lái)自百度百科:Android系統(tǒng)提供給應(yīng)用開(kāi)發(fā)者的本身就是一個(gè)框架妒潭,所有的應(yīng)用開(kāi)發(fā)都必須遵守這個(gè)框架的原則悴能。我們?cè)陂_(kāi)發(fā)應(yīng)用時(shí)就是在這個(gè)框架上進(jìn)行擴(kuò)展。Android應(yīng)用框架功能如下:
- android.app:提供高層的程序模型和基本的運(yùn)行環(huán)境雳灾。
- android.content:包含對(duì)各種設(shè)備上的數(shù)據(jù)進(jìn)行訪問(wèn)和發(fā)布漠酿。
- android.database:通過(guò)內(nèi)容提供者瀏覽和操作數(shù)據(jù)庫(kù)。
- android.graphics:底層的圖形庫(kù)谎亩,包含畫(huà)布炒嘲、顏色過(guò)濾、點(diǎn)等匈庭。
- android.location:定位和相關(guān)服務(wù)的類(lèi)夫凸。
- android.media:提供一些類(lèi)管理多種音頻、視頻的媒體接口阱持。
- android.net:提供幫助網(wǎng)絡(luò)訪問(wèn)的類(lèi)夭拌,超過(guò)通常的java.net.*接口。
- android.os:提供了系統(tǒng)服務(wù)衷咽、消息傳輸和IPC機(jī)制鸽扁。
- android.opengl:提供OpenGL的工具。
- android.provider:提供訪問(wèn)Android內(nèi)容提供者的類(lèi)镶骗。
- android.telephony:提供與撥打電話相關(guān)的API交互桶现。
- android.view:提供基礎(chǔ)的用戶界面接口框架。
- android.util:涉及工具性的方法鼎姊,例如時(shí)間日期的操作骡和。
- android.webkit:默認(rèn)瀏覽器操作接口。
- android.widget:包含各種UI元素(大部分是可見(jiàn)的)在應(yīng)用程序的布局中相寇。
3.運(yùn)行庫(kù)層(本地框架和JAVA運(yùn)行環(huán)境)
運(yùn)行庫(kù)層包括運(yùn)行庫(kù)(Libraries)和Android運(yùn)行時(shí)(Android Runtime):
3.1運(yùn)行庫(kù)(Libraries)
Android 包含一些C/C++庫(kù)慰于,這些庫(kù)能被Android系統(tǒng)中不同的組件使用。它們通過(guò) Android 應(yīng)用程序框架為開(kāi)發(fā)者提供服務(wù)唤衫。以下是一些核心庫(kù):
- Bionic系統(tǒng)C庫(kù):從 BSD 繼承來(lái)的標(biāo)準(zhǔn) C 系統(tǒng)函數(shù)庫(kù)(libc)东囚,它是專門(mén)為基于嵌入式linux 設(shè)備定制的。
- 媒體庫(kù):基于PacketVideo OpenCORE战授;該庫(kù)支持多種常用的音頻页藻、視頻格式回放和錄制,同時(shí)支持靜態(tài)圖像文件植兰。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG份帐。
- Surface Manager:對(duì)顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提供了2D和3D圖層的無(wú)縫融合楣导。
- Webkit,LibWebCore:最新的web瀏覽器引擎废境,支持Android瀏覽器和一個(gè)可嵌入的web視圖。鼎鼎大名的 Apple Safari背后的引擎就是Webkit筒繁。
- SGL:底層的2D圖形引擎噩凹。
- 3D libraries:基于OpenGL ES 1.0 APIs實(shí)現(xiàn);該庫(kù)可以使用硬件 3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速毡咏。
- FreeType:位圖(bitmap)和矢量(vector)字體顯示驮宴。
- SQLite:輕型關(guān)系型數(shù)據(jù)庫(kù)引擎。
- 還有部分就是硬件抽象層(HAL)呕缭。其實(shí)Android并非將所有的設(shè)備驅(qū)動(dòng)都放在linux內(nèi)核里面堵泽,而是實(shí)現(xiàn)在userspace空間,這么做的主要原因是GPL協(xié)議恢总,Linux是遵循該協(xié)議來(lái)發(fā)布的迎罗,也就意味著對(duì)linux內(nèi)核的任何修改,都必須發(fā)布其源代碼片仿。而現(xiàn)在這么做就可以避開(kāi)而無(wú)需發(fā)布其源代碼纹安,畢竟它是用來(lái)賺錢(qián)的。而在linux內(nèi)核中為這些userspace驅(qū)動(dòng)代碼開(kāi)一個(gè)后門(mén)砂豌,就可以讓的userspace驅(qū)動(dòng)直接控制硬件厢岂。而只需要公布這個(gè)后門(mén)代碼即可。一般情況下如果要將Android移植到其他硬件去運(yùn)行奸鸯,只需要實(shí)現(xiàn)這部分代碼即可咪笑。包括:顯示器驅(qū)動(dòng),聲音娄涩,相機(jī)窗怒,GPS,GSM等等
3.2Android運(yùn)行時(shí)(Android Runtime)
Android運(yùn)行時(shí)包括核心庫(kù)和Dalvik虛擬機(jī):
3.2.1核心庫(kù)
核心庫(kù)兼容了大多數(shù)Java語(yǔ)言所需要調(diào)用的功能函數(shù)(核心庫(kù)雖然實(shí)現(xiàn)了Java標(biāo)準(zhǔn)部分的大部分內(nèi)容,但也有部分API沒(méi)有被支持蓄拣,比如GUI系統(tǒng)的Swing等)扬虚。
3.2.2Dalvik虛擬機(jī)/ART虛擬機(jī)
Dalvik虛擬機(jī)是一種基于寄存器的Java虛擬機(jī),主要是完成對(duì)生命周期的管理球恤、堆棧的管理辜昵、線程的管理、安全和異常的管理以及垃圾回收等重要功能咽斧。每個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行堪置,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例躬存。Dalvik虛擬機(jī)執(zhí)行.dex文件(該格式文件針對(duì)小內(nèi)存使用做了優(yōu)化),所有的類(lèi)都經(jīng)由JAVA編譯器編譯舀锨,然后通過(guò)SDK中的"dx"工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行岭洲。
同時(shí)Dalvik虛擬機(jī)也依賴于linux內(nèi)核的一些功能,比如線程機(jī)制和底層內(nèi)存管理機(jī)制坎匿。
Android Runtime(縮寫(xiě)為ART)盾剩,在2013年作為Android 4.4系統(tǒng)中的一項(xiàng)測(cè)試功能正式對(duì)外發(fā)布,在Android 5.0及后續(xù)Android版本中作為正式的運(yùn)行時(shí)庫(kù)取代了Dalvik替蔬。
4.Linux內(nèi)核層
Android的核心系統(tǒng)服務(wù)依賴于 Linux 2.6 內(nèi)核 告私,如安全性,內(nèi)存管理承桥,進(jìn)程管理驻粟,網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。 Linux內(nèi)核也同時(shí)作為硬件和軟件棧之間的抽象層快毛。其外還對(duì)其做了部分修改格嗅,主要涉及兩部分修改:
4.1Binder (IPC)
提供有效的進(jìn)程間通信,雖然linux內(nèi)核本身已經(jīng)提供了這些功能唠帝,但Android系統(tǒng)很多服務(wù)都需要用到該功能屯掖,為了某種原因其實(shí)現(xiàn)了自己的一套(安全和效率)。
4.2.電源管理
主要是為了省電襟衰。