了解Android系統架構

版權聲明:本文為作者原創,轉載必須注明出處。
轉載請注明出處:http://www.lxweimin.com/p/c2fffcd5caf2

博主本人以前是做app開發的,之后轉做framework開發,因為android系統非常龐大繁雜,以前積累的知識都比較零散,沒有一個整體的認識,所以這篇文章希望先對整個android系統架構有個比較完整的了解,之后再細分模塊來逐一學習。
那么先來看看整個Android系統的架構:

從圖上可以看到,Android使用的是層級式架構,好處就是高內聚、低耦合。各層相對獨立,我不需要知道其他層的具體業務和邏輯,我單純地只需要從下層拿到對應的內容,把它包裝好,提供給上層使用,就類似于工廠流水線。
下面對每層做個簡單的介紹:

一、應用層:
Android平臺的應用層上包括各類與用戶直接交互的應用程序,或由java語言編寫的運行于后臺的服務程序,這里分為系統應用和第三方應用。其中系統應用可用作用戶的應用,以及提供開發者可從其自己的應用訪問的主要功能。例如,如果您的應用要發短信,您無需自己構建該功能,可以改為調用已安裝的短信應用向您指定的接收者發送消息。

二、framework層:該層的實現是Java
提供開發Android應用程序所需的一系列基礎API支持,包括了開發所需的一系列組件和系統服務等。
包括:
1)應用程序框架:這一層可以理解為 Android SDK,提供四大組件,視圖系統(View System)、各種Manager等等平時開發中用到的基礎部件。以下列舉一部分:

應用程序框架層類庫名稱 功能
活動管理器(Activity Mananger) 管理各個應用程序生命周期并提供常用的導航回退功能,為所有程序的窗口提供交互的接口
窗口管理器(Window Manager) 對所有開啟的窗口程序進行管理
內容提供器(Content Provider) 提供一個應用程序訪問另一個應用程序數據的功能,或者實現應用程序之間的數據共享
視圖系統(View System) 創建應用程序的基本組件,包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons),還有可嵌入的web瀏覽器。
通知管理器(Notification Manager) 使應用程序可以在狀態欄中顯示自定義的客戶提示信息
包管理器(Package Manager) 對應用程序進行管理,提供的功能諸如安裝應用程序,卸載應用程序,查詢相關權限信息等。
資源管理器(Resource Manager) 提供各種非代碼資源供應用程序使用,如本地化字符串,圖片,音頻等
位置管理器(Location Manager) 提供位置服務
電話管理器(Telephony Manager) 管理所有的移動設備功能
XMPP服務 是Google在線即時交流軟件中一個通用的進程,提供后臺推送服務

2)Java系統服務: 這部分系統服務又可以分為兩種:Java核心系統服務和Java硬件系統服務。
(1)Java核心系統服務是Android系統正常運轉的基礎,包括大家所熟知的AMS、WMS、PMS等。例如:

(2)Java硬件服務是為應用提供硬件控制服務,如電話服務、wifi服務、PowerManagerService等。例如:

該兩層之前,通過Binder實現進程間通信。允許framework來跨進程邊界,來調用Android的系統服務的代碼,這使得框架API與Android系統服務能夠進行交互。

總結:應用程序---SDK---->系統框架層---Binder IPC--->系統服務層。

以app 獲取GPS信息為例:

三、native層:該層的實現是C/C++
開篇首張圖中,用紅線框住的均屬于該層:包括C/C++ libs 、android runtime、HAL
1)C/C++ libs:C/C++編寫的系統類庫
(1) 本地守護進程
init進程根據init.rc文件中的定義,啟動本地守護進程。這些進程會常駐在系統中,有的只會啟動一次,有的如果退出了,還會被init啟動。具體的啟動方式就在init.rc中定義。
下面大體列舉幾個守護進程及其功能。

守護進程 功能
vold 管理存儲設備,自動安裝存儲設備,將設備分區格式化
netd 管理藍牙、wifi、usb等各種網絡連接
installd 負責安裝及卸載軟件包,確認軟件包的完整性
rild 接收來自于phone應用程序或其他客戶端程序發出的調制解調控制請求,并傳遞給調制解調器
adbd 提供可以調試Android的環境
servicemanager binder通信大管家
surfaceflinger 負責android系統的UI圖形顯示
mediaserver 負責播放音頻、視頻,camera拍照錄像

(2) Native系統服務
由c++語言編寫,運行在本地守護進程中。比如mediaserver守護進程中就包含AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService和SoundTriggerHwService等服務。在所屬進程初始化的時候會將Native系統服務注冊到ServiceManager中。這樣,其他的應用或服務就可以通過binder機制調用Native系統服務了。 當然,我們也可以自己開發一個Native系統服務,實現其Binder接口,這樣Native層的其他應用或服務就可以調用該服務了。 如果我們開發的Native系統服務想提供給Java層應用使用,就需要實現一個Java接口,然后通過JNI調用Native系統服務。

(3) 功能性的Native類庫支持
比如:Webkit 、OpenGL ES 、SQlite等。

通過一張圖對系統服務有個大致了解:

2)Android Runtime: Android運行環境,對java提供支持
(1) 虛擬機:Dalvik and Art(android 4.4之后)
作用:面向Linux、為嵌入式操作系統設計的虛擬機,主要負責完成對象生命周期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等。
android為每個程序提供一個vm,可以使每個app都運行在獨立的運行環境,使穩定性提高,并且一個vm能運行多個進程。
android apk都被編譯成字節碼(bytecode),在運行的時候,vm是先將字節碼編譯真正可執行的代碼,否則不同硬件設備的兼容是很大的麻煩。
(2) core libs: 核心庫提供了Java se API的多數功能,包括JNI,并提供Android的核心API,如android.os,android.net,android.media等。

  1. HAL 硬件抽象層 基于商業隱私考慮,對Kernel層進行二次封裝,屏蔽數據處理細節,運行于用戶空間。
    鑒于商業隱私考慮,許多硬件設備廠商不希望公開其設備驅動的源代碼,如果能將android的應用框架層與linux系統內核的設備驅動隔離,使應用程序框架的開發盡量獨立于具體的驅動程序,則android將減少對Linux內核的依賴。HAL由此而生,它是對Linux內核驅動程序進行的封裝,將硬件抽象化,屏蔽掉了底層的實現細節。HAL規定了一套應用層對硬件層讀寫和配置的統一接口,本質上就是將硬件的驅動分為用戶空間和內核空間兩個層面;Linux內核驅動程序運行于內核空間,硬件抽象層運行于用戶空間。也正是由于這個分層的原因,Android被踢出了Linux內核主線代碼樹中。大家想想,Android放在內核空間的驅動程序對硬件的支持是不完整的,把Linux內核移植到別的機器上去時,由于缺乏硬件抽象層的支持,硬件就完全不能用了,這也是為什么說Android是開放系統而不是開源系統的原因。

另外談到該層,還需要了解兩個東西:
JNI:Java Native Interface,即 Java本地接口。使得Java 與 本地其他類型語言(如C、C++)交互。JNI 是屬于 Java 的,與 Android 無直接關系。
NDK:Native Development Kit,是 Android的一個工具開發包 。快速開發C、 C++的動態庫,并自動將so和應用一起打包成 APK 即可通過 NDK在 Android中 使用 JNI與本地代碼(如C、C++)交互。NDK是屬于 Android 的,與Java并無直接關系。

ndk可以通過native code跨過使用dalvik runtime,直接調用到android內核資源,而sdk則需要在dalvik runtime環境下才能調用到內核資源。然而兩者并不是各司其職,各不相關。android提供了JNI(java native interface)使兩者可以進行相互調用和通信。

四、Kernel層:
Android以Linux操作系統內核為基礎,借助Linux內核服務實現硬件設備驅動,進程和內存管理,網絡協議棧,電源管理,無線通信等核心功能。Android4.0版本之前基于Linux2.6系列內核,4.0及之后的版本使用更新的Linux3.X內核,并且兩個開源項目開始有了互通。Linux3.3內核中正式包括一些Android代碼,可以直接引導進入Android。Linux3.4增添了電源管理等更多功能,以增加與Android的硬件兼容性,使Android在更多設備上得到支持。直到現在最新的android6.0仍然繼續延用著linux3.4.0,而linux最新的版本已經到了4.3系列,那么為什么android沒有繼續去更新Linux kernel的版本也是一個值得探討的課題。
Android內核 對Linux內核進行了增強,增加了一些面向移動計算的特有功能。例如,低內存管理器LMK(Low Memory Keller),匿名共享內存(Ashmem),以及輕量級的進程間通信Binder機制等。這些內核的增強使Android在繼承Linux內核安全機制的同時,進一步提升了內存管理,進程間通信等方面的安全性。下表列舉了Android內核的主要驅動模塊:

驅動名稱 說明
Android電源管理(Power Management) 針對嵌入式設備的,基于標準Linux電源管理系統的,輕量級的電源管理驅動
低內存管理器(Low Memory Keller) 低內存管理器(Low Memory Keller) 可以根據需要殺死進程來釋放需要的內存。擴展了Linux的OOM機制,形成獨特的LMK機制
匿名共享內存(Ashmem) 為進程之間提供共享內存資源,同時為內核提供回收和管理內存的機制
日志(Android Logger) 一個輕量級的日志設備
定時器(Anroid Alarm) 提供了一個定時器用于把設備從睡眠狀態喚醒
物理內存映射管理(Android PMEM) DSP及其他設備只能工作在連續的物理內存上,PMEM用于向用戶空間提供 連續的物理內存區域映射
Android定時設備(Android Timed device) 可以執行對設備的定時控制功能
Yaffs2文件系統 Android采用大容量的NAND閃存作為存儲設備,使用Yaffs2作為文件系統管理大容量MTD NAND Flash;Yaffs2占用內存小,垃圾回收簡潔迅速。
Android Paranoid網絡 對Linux內核的網絡代碼進行了改動,增加了網絡認證機制。可在IPV4,IPV6和藍牙中設置,由ANDROID_PARANOID_NETWORK宏來啟用此特性。

參考文章:
http://gityuan.com/2015/08/01/android-arvchitecture/
http://gityuan.com/android/
http://blog.csdn.net/sp6645597/article/details/50472740
http://blog.csdn.net/u010753159/article/details/52193061
http://blog.csdn.net/lpjishu/article/details/50781415
http://blog.csdn.net/luoshengyang/article/details/6567257

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容