Android 隨想錄之 Android 系統架構

應用層(Application)

Android 的應用層由運行在 Android 設備上的全部應用程序共同構成(系統預裝程序以及第三方應用程序)。java

系統預裝應用程序包含撥號軟件、短信、聯繫人、郵件客戶端、日曆、地圖以及瀏覽器等提供基礎功能的應用程序構成。第三方應用程序則是基於 Android SDK(Android Software Development Kit)進行開發,並受到框架層 SDK 接口約束的應用程序。二者的區別在於,系統預裝應用比第三方應用擁有更高的系統使用權限:系統預裝應用可使用 SDK 中隱藏的、不對第三方應用開放的系統 API。android

一般狀況下,Android 應用程序是使用 Java 做爲主要開發語言的。若是需求中涉及到性能要求較高的運算、圖形處理或者須要使用已經存在的 C/C++類庫,經過 Java 實現的話,則可能帶來運行效率低下、C/C++類庫移植成本太高等問題。所以,在開發過程當中,咱們可使用 C/C++實現底層模塊,並經過 JNI(Java Native Interface)接口實現底層模塊與 Java 層的互相調用。數據庫

Android 提供的 NDK(Native Development Kit)中包含的交叉編譯工具用來支持 Java 與 C/C++的相互調用。經過 NDK 甚至能夠繞過框架層 SDK 接口的約束,直接使用 C++調用特定的系統功能。自 Android 2.3 (Api Level 9)以後,新增android.app.NativeActivity 類(經過調用預約義的 JNI 接口實現),這就意味着可使用 C/C++完成整個應用程序的開發。編程

因爲 Android 中大多數的控件並無提供 Native 的實現,若是須要進行大量的 UI 開發工做(使用遊戲引擎開發遊戲除外),則大大下降了開發效率。瀏覽器

一種理想狀況下的設計思想是,使用 Java 做爲上層 UI 的實現,使用 C/C++做爲業務層面的實現,經過 Android 的交叉編譯工具完成整個應用程序的開發。安全

由此帶來的好處是,執行效率的提高以及對核心業務的保護。效率的提高是由 C/C++ 自己的執行效率決定的,而對核心業務的保護則是由 C/C++ 反編譯的難度較高、反編譯後文件難於閱讀的特性決定的。網絡

可是由此帶來的開發效率下降、維護和調試難度增大,甚至會形成兼容性降低等因素也是不得不考慮的。數據結構

框架層 (Application Framework)

框架層是 Android 系統中最爲核心的部分,也是 Android 系統設計思想集中體現的部分。架構

框架層提供了大量的 API 供開發者調用,而弄清楚這些 API 的具體功能和用法則是 Android 應用程序開發過程當中最爲重要的環節。app

框架層不僅是應用程序開發的基礎,也是軟件複用的重要手段,任何一個應用程序均可以發佈它的功能模塊——只要發佈時遵照了框架層的約定,那麼其餘的應用程序也可使用這個模塊。

框架層由多個系統服務(System Service)組成,包括組件管理服務、窗口管理服務、地理信息服務、電源管理服務、通話管理服務等。全部的系統服務都寄宿在系統核心進程(System Core Process)中,在運行時,每一個服務都佔據一個獨立的進程,彼此之間經過進程間通訊機制(IPC,Inter-Process Communication)發送消息以及傳輸數據。

對於開發者而言,最爲直觀的框架層體現就是 Android SDK,它經過一系列的 Java 功能模塊來實現應用所須要的可複用的組件,提供了應用開發的規範,屏蔽了應用層與底層交互的複雜性。

框架層的設計決定了上層應用程序的開發模式、開發效率以及可以實現的功能範疇。

從系統運行的角度來看,Android 指望框架層是全部應用程序運行的核心,參與到應用層的每一次操做中,並進行全局統籌。Android 應用的最大特徵是基於組件的設計方式,每一個應用程序都由若干個組件構成,組件與組件之間經過框架層的系統服務集中的調度和傳遞信息。

框架層主要是使用 Java 和 JNI 實現的,位於該層的主要組件以下:

  • 視圖系統(View System) 提供了可擴展的用於構建應用程序 UI 的控件,包括ListViewGridViewTextViewButtonWebView 等。
  • 內容提供器(Content Provider) 提供應用程序之間數據共享的接口。
  • 資源管理器(Resource Manager) 提供非代碼資源的訪問接口,如字符串、佈局文件等。
  • 通知管理器(Notification Manager) 用來在狀態欄顯示自定義的 提示信息。
  • 活動管理器(Activity Manager) 用來管理應用程序生命週期並提供通用的導航回退功能。
  • 窗口管理器(Window Manager) 管理全部的窗口程序。
  • 包管理器(Package Manager) 提供 Android 系統內的程序管理。

框架層是基於 Android 核心類庫實現的 Android 系統框架層的 API,也就是應用開發人員所使用的 Android 開發包。Android 開發包以 android.開頭,其實現位於framework\base\目錄中,其中framework \base\core\java包含了大部分 API,還有另一部分 API 屬於Android 系統庫中的擴展庫部分,分別位於:

  • framework\base\graphics\java\
  • framework\base\media\java\
  • framework\base\opengl\java\
  • framework\base\wifi\java\
  • framework\base\location\java\

Android 運行時(Android Runtime)

Android 運行時有兩部分組成:Android 核心類庫和 Dalvik 虛擬機。其中核心類庫提供了 Java 語言核心庫所能使用的絕大部分功能,包括Java 對象庫、文件管理庫、網絡通訊等。 Dalvik 虛擬機則提供了 Android 應用程序的運行環境,負責動態解析執行應用、分配空間、管理對象生命週期等工做。

Android 運行時使得 Android 設備從本質上與一個移動 Linux 實現區分開來。

Dalvik 虛擬機

與傳統的 Java 虛擬機不一樣的是,一方面,Dalvik 虛擬機使用新的二進制碼格式文件.dex,而再也不使用傳統虛擬機的二進制碼做爲其編譯的中間文件(.class)。在 Android 應用程序的編譯過程當中,Android 會對部分.class文件中的指令作轉義處理,使用 Dalvik 虛擬機特有的指令集 OpCodes 替換,並將全部的.class文件統一轉換成.dex文件。.dex文件會整合.class文件中的重複信息,並對冗餘部分作全局的優化,合併重複的常量定義,節約常量池的資源開銷,另外一方面,Dalvik虛擬機放棄了傳統虛擬機基於棧的指令架構,採用基於寄存器的指令架構設計,以確保更爲高效的執行效率和硬件能力。

基於堆棧的指令架構相對於基於寄存器的架構,其指令更爲緊湊。Java 虛擬機使用的指令只佔據一個字節,於是被稱做字節碼。基於寄存器的指令架構因爲須要指定源地址和目標地址,於是須要更多的指令空間(Dalvik 虛擬機的某些指令只要佔據兩個字節碼)。通常來講,執行一樣的代碼,前者須要更多的指令,然後者則須要更多的指令空間。須要更多的指令意味着須要佔用更多的 CPU 時間,而須要更大的指令空間則意味着數據緩衝(d-cache)更容易失效。

此外,基於寄存器的設計則更有利於進行 AOT(AHead-Of-Time)優化。AOT 優化就是在解釋型語言運行以前,就先將它編譯成本地機器語言。

每一個 Android 應用都運行在單獨的 Dalvik 虛擬機中(每一個 Android 進程對應一個虛擬機進程),每一個 Dalvik 虛擬機則運行在獨立的 Linux 進程空間中。每一個 Android 進程之間經過進程間通訊機制(IPC,Binder 的實現機制)進行通訊,而虛擬機的線程管理、內存管理則是依賴於 Linux 內核實現的。

不一樣的應用程序最後在不一樣的 Linux 進程空間中運行,即便其中一個虛擬機進程意外關閉或終止,不會對其餘的虛擬機進程形成影響,從而最大限度的保證了應用程序的獨立運行和隔離。

Android 核心類庫(Core Libraries)

一般狀況下,Android 應用程序使用 Java 語言編寫,其大部分 Java 語言基礎功能都由 Android 核心庫提供,好比基礎數據結構、數學、I/O、工具、數據庫、網絡等庫。其中大部分實現來源於 ApacheHarmony 項目,核心庫的具體實現位於libcore目錄中,Java 部分最終會被打包爲core.jar包,通過安裝,最終將被放置在目標文件系統的system\framework\目錄中,當桌面啓動時首先加載,做爲 Java 程序的一個基礎包。

libcore中的 C/C++ 代碼被編譯爲libjavacore.a靜態庫,是 Java 核心庫的本地代碼。

另外,libcore目錄中還包括部分測試用例,用來測試 Java 核心庫的基本接口功能實現,在移植 Android 或者其虛擬機時,也可使用它們來測試 Java 核心庫的功能。

核心庫主要實現瞭如下 Java 基礎包:

  • Java 標準API(java.*
  • Java 擴展 API(javax.*
  • 企業和組織提供的 Java 類庫(org.*

以及如下 Android 的核心 API:

  • android.os
  • android.net
  • android.media

類庫(Libraries)

核心類庫有一系列的二進制動態連接庫組成,一般使用 C/C++進行開發。與框架層服務相比,核心類庫不能獨立運行於線程中,而是經過系統服務將其加載到其所在的進程空間中,並經過類庫提供的 JNI 接口進行調用。

下面是常見的系統類庫:

  • Surface Manager 執行多個應用程序的時候,負責管理顯示與存取操做間的互動,另外也負責2D 與3D 圖層的無縫整合。
  • Media Framework 多媒體支持庫,基於 PacketVideo 的 OpenCore,支持多種常見的音視頻格式的錄製和播放,支持的編碼格式包括 MPEG四、MP三、H.24六、AAC、ARM。
  • SQLite 輕量級的關係型數據庫。
  • OpenGL ES 基於OpenGL ES 的3D 繪圖函數庫。
  • Free Type 位圖與向量字體的顯示。
  • WebKit 網頁瀏覽器的解析引擎。
  • SGL底層的2D圖形渲染引擎。
  • SSL 在 Android 通訊過程當中實現握手。
  • Libc 從 BSD 派生出來的標準 C 函數庫。

硬件抽象層(HAL)

硬件抽象層(HAL,Hardware Abstraction Layer)是介於內核和 Libraries 層中間的,抽象出來的一層結構。Android 的硬件抽象層能夠以閉源源碼的形式提供硬件驅動模塊。HAL 存在的目的是爲了把 Framework 層與 Linux 內核隔離開,使得 Android 不會過分依賴 Linux 內核,以達到「內核獨立」的目的。它是對 Linux 驅動的封裝,對上層服務提供統一的接口,屏蔽了底層的實現細節。

臺灣著名架構師高煥堂老師對 HAL 的的理解則是「爲了一些硬件提供商提出的‘專利保護’的硬件驅動程序而產生的,簡而言之,就是爲了避開 Linux內核的 GPL 協議的束縛」。

關於 Android 增長 HAL 層的更多內容請參考 Android ,在爭議中逃離 Linux 內核的 GPL 約束

Linux 內核

Android 最先的版本是基於 Linux2.6 內核提供核心系統系統服務的,例如安全、內存管理、進程管理、網絡堆棧、驅動模型等。Linux 內核做爲硬件和軟件之間的抽象層,屏蔽掉硬件的差別性併爲上層提供統一服務。

參考文獻

《瘋狂 Android 講義》
《Android 開發精要》
《Android 的設計與實現》
《Android 4高級編程(第三版)》

麥子學院 Android 架構之 HAL 的商業意義(高煥堂)

RednaxelaFX 的 虛擬機隨談(一):解釋器,樹遍歷解釋器,基於棧與基於寄存器,大雜燴

羅昇陽的 Dalvik虛擬機簡要介紹和學習計劃

相關文章
相關標籤/搜索