Android系統四層體系結構詳解
阿新 • • 發佈:2019-02-16
開門見山,先上圖
很明顯四層:接下來一一講解:
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