Android采用分層的架構(gòu),分為四層,從高層到底層分為應(yīng)用程序?qū)樱╝pp+System apps),應(yīng)用程序框架層(Java API Framework),系統(tǒng)運(yùn)行庫和運(yùn)行環(huán)境層(Libraries + android Runtime)和Linux核心層(HAL+ Linux Kernel),如下圖所示:

還有一張中文簡化版的分層圖如下:

1. Linux核心層
linux內(nèi)核(Linux Kernel)
Android平臺的基礎(chǔ),直接和硬件打交道。硬件驅(qū)動、進(jìn)程管理、內(nèi)存管理、網(wǎng)絡(luò)管理的功能在這里實(shí)現(xiàn)。
硬件抽象層(Hardware Abstraction Layer)
為上層的Java API Framework提供相關(guān)硬件的界面顯示,Audio,Bluetooth等是組成硬件抽象層的庫模塊,實(shí)現(xiàn)每個(gè)硬件的界面顯示功能。
2. 系統(tǒng)運(yùn)行庫和運(yùn)行環(huán)境層
Android 運(yùn)行環(huán)境(Android Runtime)
Android 5.0(API 21)之前使用的是Dalvik虛擬機(jī),之后被ART所取代。
ART是Android操作系統(tǒng)的運(yùn)行環(huán)境,通過運(yùn)行虛擬機(jī)來執(zhí)行dex文件。其中,dex文件是專為安卓設(shè)計(jì)的的字節(jié)碼格式,好處多多,不再贅述。Android toolchain(一種編譯工具)可以將Java代碼編譯為dex字節(jié)碼格式,過程如下圖,jack是一種編譯工具鏈(tool chain)

為了便于理解,做個(gè)類比,我們都知道,java程序的運(yùn)行需要java的核心包的支持,然后通過JVM虛擬機(jī)來運(yùn)行我們的應(yīng)用程序。在Android中,Android程序的運(yùn)行需要core Libararies的支持,然后通過ART或者Dalvik來運(yùn)行該程序。
原生C/C++ 庫(Native c/c++ Libraries)
上面提到的ART就依賴于C/C++庫。開發(fā)者可以通過調(diào)用Java API Framework來使用原生庫的功能,也可以用Android NDK直接調(diào)用原生庫。
3. 應(yīng)用程序框架層
java API Framework
我們最常用的組件和服務(wù)都在這一層,也是每一個(gè)安卓開發(fā)者必須要熟悉的一層,
4. Application層
系統(tǒng)應(yīng)用(system apps)
可以理解為內(nèi)置在Android系統(tǒng)的app,我們可以像調(diào)用Java API Framework層一樣直接調(diào)用系統(tǒng)app。
我們也可以自己編寫System app,但是要注意系統(tǒng)應(yīng)用的權(quán)限比較特殊,直接寫在manifest里面是不行的。需要做特別的處理,參考http://www.programgo.com/article/76213742299/
因此,app開發(fā)主要研究Java API Framework層和應(yīng)用程序?qū)蛹纯?,如果有用到JNI,還需要研究一下Native c/c++ Libraries。但是Android運(yùn)行庫和Android運(yùn)行時(shí)主要是從事系統(tǒng)開發(fā)的人員需要研究的。把握全局的同時(shí),也要搞清楚重點(diǎn),畢竟,術(shù)業(yè)有專攻?!?/p>