1. 程式人生 > >Android系統四層體系結構詳解

Android系統四層體系結構詳解

開門見山,先上圖

Android系統架構圖
很明顯四層:接下來一一講解:

Java應用程式層:

Android會同一系列核心應用程式包一起釋出,該應用程式包包括客戶端,SMS短訊息程式,日曆,地圖,瀏覽器,聯絡人管理程式等。所有的應用程式都是使用JAVA語言編寫的。

什麼?這你已經知道了。那麼你知道這些應用程式都是呼叫應用程式框架層的介面寫的嗎。那又怎樣?顯然你自己也可以使用Java通過Java原生介面JNI(Java Native Interface)的方式,配合Android NDK來開發原生程式(Android Studio裡面可以直接整合NDK,你只需要下載安裝。我的另外一篇部落格裡面也有例項).它允許Java程式碼和其他語言寫的程式碼(通常為 C和C++ ,形成的程式碼稱為原生代碼)進行互動.使用Java與本地已編譯的程式碼互動,通常會喪失平臺可移植性.但有些情況下這樣做是可以接受的,甚至是必須的。

Java應用程式框架層

這一層剛剛已經提到了一下,他其實就是隱藏在每個應用後面的是一系列的服務和系統。

什麼?這太籠統了,OK,我們仔細說一下:

應用框架層為應用開發者提供了用以訪問核心功能的API框架.應用框架層提供了各種服務和管理工具,包括了應用開發所需的介面管理、資料訪問、應用層的訊息傳遞、應用包的管理、電話管理、定位管理等功能。

它主要包括以下幾部分:

豐富而又可擴充套件的檢視(Views),可以用來構建應用程式, 它包括列表(Lists),網格(Grids),文字框(Text boxes),按鈕(Buttons), 甚至可嵌入的web瀏覽器。

內容提供器(Content Providers)使得應用程式可以訪問另一個應用程式的資料(如聯絡人資料庫), 或者共享它們自己的資料。

資源管理器(Resource Manager)提供 非程式碼資源的訪問,如本地字串,圖形,和佈局檔案(Layout files )。

通知管理器 (Notification Manager) 使得應用程式可以在狀態列中顯示自定義的提示資訊。

活動管理器( Activity Manager) 用來管理應用程式生命週期並提供常用的導航回退功能。

什麼,你覺得這還不夠直觀,那麼請往下看:

我們在開發應用時都是通過框架來與Android底層進行互動,接觸最多的就是應用框架層了。

Android系統提供給應用開發者的本身就是一個框架,所有的應用開發都必須遵守這個框架的原則。我們在開發應用時就是在這個框架上進行擴充套件。Android應用框架功能如下。

  *android.app:提供高層的程式模型和基本的執行環境。
  *android.content:包含對各種裝置上的資料進行訪問和釋出。
  *android.database:通過內容提供者瀏覽和操作資料庫。
  *android.graphics:底層的圖形庫,包含畫布、顏色過濾、點、矩形,可以將它們直接繪製到螢幕上。
  *android.location:定位和相關服務的類。
  *android.media:提供一些類管理多種音訊、視訊的媒體介面。
  android.net:提供幫助網路訪問的類,超過通常的java.net.介面。
  *android.os:提供了系統服務、訊息傳輸和IPC機制。
  *android.opengl:提供OpenGL的工具。
  *android.provider:提供訪問Android內容提供者的類。
  *android.telephony:提供與撥打電話相關的API互動。
  *android.view:提供基礎的使用者介面介面框架。
  *android.util:涉及工具性的方法,例如時間日期的操作。
  *android.webkit:預設瀏覽器操作介面。
  *android.widget:包含各種UI元素(大部分是可見的)在應用程式的佈局中。
如果覺得不夠清晰,可以自己查閱Android API文件。

C、C++本地庫和Android執行時環境

開發者可以在自己的應用中使用C、C++本地庫中的介面來方便地實現官方 API未實現的功能 . 例如,Facebook提供了一個開源的Java庫,開發者可以在自己的 應 用 中 嵌 入 Facebook的 部 分 社 交 功 能, 第三 方類庫獨立於 Android系統架構實現,但與系統架構處於相同的地位,都是使用核心層來提供服務,實現、封裝功能模組,供應用層呼叫.

什麼,你說我說的還不夠明白,OK,我接著說:

Android 包含一些C/C++庫,這些庫能被Android系統中不同的元件使用。它們通過 Android 應用程式框架為開發者提供服務。以下是一些核心庫:

系統 C 庫 - 一個從BSD (Berkeley Software Distribution,伯克利軟體套件),Unix的衍生系統繼承來的標準C系統函式庫 Libc ), 它是專門為基於Embedded linux的裝置定製的。

媒體庫 - 基於PacketVideo OpenCORE;該庫支援多種常用的音訊、視訊格式回放和錄製,同時支援靜態影象檔案。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

Surface Manager - 對顯示子系統的管理,並且為多個應用程式提 供了2D和3D圖層的無縫融合。

LibWebCore - 一個最新的web瀏覽器引擎用,支援Android瀏覽器和一個可嵌入的web檢視。

Android執行時環境( Android Runtime)提供了核心連結庫(Core Libraries)和 Dalvik VM虛擬系統(Dalvik Virtual Machine),採用 Java開發的應用程式編譯成 apk程式程式碼後,交給 Android操作環境來執行。

Android採用 Dalvik VM來代替 Java VM,熟悉 Java SE開發環境的開發人員可以很快地學會開發 Android應用程式。將寫好的 Java程式“.java”先編譯成“.class”程式,這個過程和開發 Java SE是相同的;接下來再次編譯成可以在 Dalvik VM執行的“.dex”程式,最後要包裝成 Android可以執行的檔案“.apk”

每個Android 應用都執行在自己的程序上, Dalvik 虛擬機器為它分配自有的例項。 Dalvik 使一臺裝置能執行多個虛擬機器程式但消耗較少的資源。

Linux核心與驅動層

Android是基於不同版本的 Linux核心開發出來的, Linux核心層包括系統層安全機制、記憶體管理、程序管理、網路堆疊及一系列的驅動模組,位於硬體與其他的軟體層之間,提供與硬體的互動.

Android 核心與標準 Linux 核心在檔案系統、程序間通訊機制、記憶體管理等方面存在不同:

Android核心中增加了標準 Linux 核心中沒有采納的 YAFFS2檔案系統。 YAFFS2 ( Yet Another Flash File Sy-stem,2nd edition ) 是專用於 Flash 的檔案系統, 對 NAND-Flash 晶片有著良好的支援。 YAFFS2 是日誌結構的檔案系統,提供了損耗平衡和掉電保護,可以有效地避免意外斷電對檔案系統一致性和完整性的影響。

Android 增加了一種程序間的通訊機制 IPC Binder , 在核心原始碼中, 驅動程式檔案為 coredroid/include/linux/binder.h 和 coredroid/drivers/android/binder.c 。 Binder 通過守護程序 Service Manager 管理系統中的服務,負責程序間的資料交換。 各程序通過 Binder 訪問同一塊共享記憶體,以達到資料通訊的機制。

Android 核心採用了一種不用於標準 Linux 核心的低記憶體管理策略。 在標準 Linux核心當中,使用一種叫做 OOM( Out of Memory) 的低記憶體管理策略;當記憶體不足時,系統檢查所有的程序,並對程序進行限制評分, 獲得最高分的程序將被關閉(核心程序除外)。 Android 系統採用的則是一種叫作LMK ( Low Memory Killer )的機制,這種機制將程序按照重要性進行分級、分組。記憶體不足時,將處於最低級別組的程序關閉。 例如,在移動裝置當中, UI 介面處於最高級別,所以該程序永遠不會被中止,這樣,在終端使用者看來,系統是穩定執行的。 在 Andorid 核心原始碼 中 , LMK 的 位 置 coredroid/drivers/misc/lowme -morykiller.c

再來理一理:

Android Linux核心核心驅動主要包括:

Android Binder,基於OpenBinder框架的一個驅動,用於提供Android平臺的程序間通訊(IPC,inter-process communication)。

Android中每個應用都是一個獨立的系統程序,而資源的管理和分配是以程序為單位進行的,通常情況下一個程序不能直接訪問另一個程序的資源.為了實現程序通訊, Android系統引入了 Binder機制,該機制是 OpenBinder在 Linux中的具體實現.這種通訊基於 Client/Server模型,通訊的雙方都必須建立一個 IBinder介面,進行通訊時, Client首先通過系統的 ServiceManager獲取目標 Service的代理物件,並通過這個代理物件呼叫Service提供的功能介面,呼叫請求會通過 Binder驅動傳送給Service,而Service的處理結果也會通過 Binder驅動傳送給 Client。

原始碼位於drivers/staging/android/binder.c

Android電源管理(PM),一個基於標準Linux電源管理系統的輕量級的Android電源管理驅動,針對嵌入式裝置做了很多優化。

原始碼位於kernel/power/earlysuspend.c

                    kernel/power/consoleearlysuspend.c
                    kernel/power/fbearlysuspend.c
                    kernel/power/wakelock.c
                    kernel/power/userwakelock.c

低記憶體管理器(Low Memory Killer),相對於Linux標準OOM(Out Of Memory)機制更加靈活,它可以根據需要殺死程序來釋放需要的記憶體。

原始碼位於drivers/staging/android/lowmemorykiller.c

匿名共享記憶體(ashmem),為程序間提供大塊共享記憶體,同時為核心提供回收和管理這個記憶體的機制。

原始碼位於mm/ashmem.c

Android PMEM(Physical),PMEM用於向用戶空間提供連續的實體記憶體區域,DSP和某些裝置只能工作在連續的實體記憶體上。

原始碼位於drivers/misc/pmem.c

Android Logger,一個輕量級的日誌裝置,用於抓取Android系統的各種日誌。

原始碼位於drivers/staging/android/logger.c

Android Alarm,提供了一個定時器用於把裝置從睡眠狀態喚醒,同時它也提供了一個即使在裝置睡眠時也會執行的時鐘基準,

原始碼位於drivers/rtc/alarm.c

USB Gadget驅動,一個基於標準Linux USB gadget驅動框架的裝置驅動,Android的USB驅動是基於gaeget框架的,

原始碼位於drivers/usb/gadget/

Android Ram Console,為了提供除錯功能,Android允許將除錯日誌資訊寫入一個被稱為RAM Console的裝置裡,它是一個基於RAM的Buffer。

原始碼位於drivers/staging/android/ram_console.c。

Android timed device,提供了對裝置進行定時控制功能,目前支援vibrator和LED裝置。

原始碼位於drivers/staging/android/timed_output.c(timed_gpio.c)。

Yaffs2檔案系統,Android採用Yaffs2作為MTD nand flash檔案系統,原始碼位於fs/yaffs2/目錄下。Yaffs2是一個快速穩定的應用於NAND和NOR Flash的跨平臺的嵌入式裝置檔案系統,同其他Flash檔案系統相比,Yaffs2使用更小的記憶體來儲存他的執行狀態,因此它佔用記憶體小;Yaffs2的垃圾回收非常簡單而且快速,因此能達到更好的效能;Yaffs2在大容量的NAND Flash上效能表現尤為明顯,非常適合大容量的Flash儲存。

參考資料:

【1】張玉清, 王凱, 楊歡, 方喆君, 王志強, 曹, 琛. Android 安全綜述[J]. 計 算 機 研 究 與 發 展, 2014, (7): 1385-1396

【2】陳璟, 陳平華, 李文亮. Android 核心分析[J]. 現代計算機(專業版), 2009, (11): 112-115