????????Android 是一種基于 Linux 的開放源代碼軟件棧,如下圖:

系統(tǒng)應(yīng)用層
????????Android 系統(tǒng)包含一系列核心應(yīng)用,比如電子郵件、短信、日歷、互聯(lián)網(wǎng)瀏覽和聯(lián)系人等。我們開發(fā)的應(yīng)用一般也位于該層。 系統(tǒng)包含的應(yīng)用與用戶開發(fā)應(yīng)用一樣,沒有特殊狀態(tài)。因此第三方應(yīng)用可成為用戶的默認(rèn)網(wǎng)絡(luò)瀏覽器、短信 Messenger 甚至默認(rèn)鍵盤(但有一些例外,例如系統(tǒng)的“設(shè)置”應(yīng)用,此外,第三方系統(tǒng)開發(fā)商可能會(huì)對(duì)系統(tǒng)應(yīng)用做出額外限制)。
????????系統(tǒng)應(yīng)用可用作用戶的應(yīng)用,以及提供開發(fā)者可從其自己的應(yīng)用訪問的主要功能。例如,如果您的應(yīng)用要發(fā)短信,您無需自己構(gòu)建該功能,可以改為調(diào)用已安裝的短信應(yīng)用向您指定的接收者發(fā)送消息。
Java API框架層
????????這個(gè)部分是使用 Java 語言編寫的 API 。這些 API 形成創(chuàng)建 Android 應(yīng)用所需的構(gòu)建塊,它們可簡化核心模塊化系統(tǒng)組件和服務(wù)的重復(fù)使用。我們也是通過使用這些API來開發(fā)應(yīng)用,從上圖看,它包含:
- Content Providers:可讓應(yīng)用訪問其他應(yīng)用(例如“聯(lián)系人”應(yīng)用)中的數(shù)據(jù)或者共享其自己的數(shù)據(jù)
- View System:,可用以構(gòu)建應(yīng)用的 UI,包括列表、網(wǎng)格、文本框、按鈕甚至可嵌入的網(wǎng)絡(luò)瀏覽器
- Managers:各種managers,如ActivityManager,LocationManager,PackageManager等一些核心模塊化系統(tǒng)組件和服務(wù),點(diǎn)擊此處查看所有API。
C/C++原生庫
????????Android包含被不同組件使用的C/C++庫,一般而言,Android應(yīng)用開發(fā)者不能直接調(diào)用,需要通過Java API框架層提供的API來簡介調(diào)用它。例如,通過 Android 框架的 Java OpenGL API訪問OpenGL。
????????如果需要開發(fā) C 或 C++ 代碼的應(yīng)用,就需要用 Android NDK直接從原生代碼訪問某些原生平臺(tái)庫。
????????一般包括以下內(nèi)容:
- C 標(biāo)準(zhǔn)庫 (
libc/libm) :專門為嵌入式Linux設(shè)備調(diào)整過的標(biāo)準(zhǔn)C系統(tǒng)庫。 - C++:支持多種 C++ 運(yùn)行時(shí)庫。
- webakit:瀏覽器引擎。
- OpenMAX AL:Android 原生多媒體處理基于 Khronos Group OpenMAX AL 1.0.1 API。
- OpenGL ES: OpenGL 三維圖形API的子集,針對(duì)手機(jī)、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)。
Android運(yùn)行時(shí)
????????Android運(yùn)行時(shí)由兩部分組成:Android核心庫集和ART。核心庫集提供了Java語言核心庫所能使用的絕大部分功能,而ART負(fù)責(zé)運(yùn)行Android應(yīng)用程序。
????????Android5.0的運(yùn)行時(shí)由Dalvik虛擬機(jī)和Android核心庫集組成,在Dalvik下,應(yīng)用每次運(yùn)行都需要通過即時(shí)編譯器(JIT)將字節(jié)碼轉(zhuǎn)換為機(jī)器碼,即每次都要編譯加運(yùn)行,這雖然會(huì)使安裝過程比較快,但是會(huì)拖慢應(yīng)用以后每次啟動(dòng)的效率。而在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會(huì)預(yù)編譯(AOT)成機(jī)器碼,這樣的話,雖然設(shè)備和應(yīng)用的首次啟動(dòng)(安裝慢了)會(huì)變慢,但是以后每次啟動(dòng)執(zhí)行的時(shí)候,都可以直接運(yùn)行,因此運(yùn)行效率會(huì)提高。
????????ART占用空間比Dalvik大(字節(jié)碼變?yōu)闄C(jī)器碼之后,可能會(huì)增加10%-20%),這也是著名的“空間換時(shí)間大法"。
硬件抽象層 (HAL)
????????硬件抽象層 (HAL)提供標(biāo)準(zhǔn)界面,向更高級(jí)別的 Java API 框架顯示設(shè)備硬件功能。HAL 包含多個(gè)庫模塊,其中每個(gè)模塊都為特定類型的硬件組件實(shí)現(xiàn)一個(gè)界面,例如相機(jī)或藍(lán)牙模塊。當(dāng)框架 API 要求訪問設(shè)備硬件時(shí),Android 系統(tǒng)將為該硬件組件加載庫模塊。
Linux內(nèi)核
????????Android 平臺(tái)的基礎(chǔ)是 Linux 內(nèi)核。例如,Android Runtime (ART)依靠 Linux 內(nèi)核來執(zhí)行底層功能,例如線程和低層內(nèi)存管理。