版權(quán)聲明:本文為作者原創(chuàng),轉(zhuǎn)載必須注明出處。
轉(zhuǎn)載請注明出處:http://www.itdecent.cn/p/c2fffcd5caf2
博主本人以前是做app開發(fā)的,之后轉(zhuǎn)做framework開發(fā),因為android系統(tǒng)非常龐大繁雜,以前積累的知識都比較零散,沒有一個整體的認(rèn)識,所以這篇文章希望先對整個android系統(tǒng)架構(gòu)有個比較完整的了解,之后再細(xì)分模塊來逐一學(xué)習(xí)。
那么先來看看整個Android系統(tǒng)的架構(gòu):

從圖上可以看到,Android使用的是層級式架構(gòu),好處就是高內(nèi)聚、低耦合。各層相對獨立,我不需要知道其他層的具體業(yè)務(wù)和邏輯,我單純地只需要從下層拿到對應(yīng)的內(nèi)容,把它包裝好,提供給上層使用,就類似于工廠流水線。
下面對每層做個簡單的介紹:
一、應(yīng)用層:
Android平臺的應(yīng)用層上包括各類與用戶直接交互的應(yīng)用程序,或由java語言編寫的運行于后臺的服務(wù)程序,這里分為系統(tǒng)應(yīng)用和第三方應(yīng)用。其中系統(tǒng)應(yīng)用可用作用戶的應(yīng)用,以及提供開發(fā)者可從其自己的應(yīng)用訪問的主要功能。例如,如果您的應(yīng)用要發(fā)短信,您無需自己構(gòu)建該功能,可以改為調(diào)用已安裝的短信應(yīng)用向您指定的接收者發(fā)送消息。
二、framework層:該層的實現(xiàn)是Java
提供開發(fā)Android應(yīng)用程序所需的一系列基礎(chǔ)API支持,包括了開發(fā)所需的一系列組件和系統(tǒng)服務(wù)等。
包括:
1)應(yīng)用程序框架:這一層可以理解為 Android SDK,提供四大組件,視圖系統(tǒng)(View System)、各種Manager等等平時開發(fā)中用到的基礎(chǔ)部件。以下列舉一部分:
| 應(yīng)用程序框架層類庫名稱 | 功能 |
|---|---|
| 活動管理器(Activity Mananger) | 管理各個應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能,為所有程序的窗口提供交互的接口 |
| 窗口管理器(Window Manager) | 對所有開啟的窗口程序進(jìn)行管理 |
| 內(nèi)容提供器(Content Provider) | 提供一個應(yīng)用程序訪問另一個應(yīng)用程序數(shù)據(jù)的功能,或者實現(xiàn)應(yīng)用程序之間的數(shù)據(jù)共享 |
| 視圖系統(tǒng)(View System) | 創(chuàng)建應(yīng)用程序的基本組件,包括列表(lists),網(wǎng)格(grids),文本框(text boxes),按鈕(buttons),還有可嵌入的web瀏覽器。 |
| 通知管理器(Notification Manager) | 使應(yīng)用程序可以在狀態(tài)欄中顯示自定義的客戶提示信息 |
| 包管理器(Package Manager) | 對應(yīng)用程序進(jìn)行管理,提供的功能諸如安裝應(yīng)用程序,卸載應(yīng)用程序,查詢相關(guān)權(quán)限信息等。 |
| 資源管理器(Resource Manager) | 提供各種非代碼資源供應(yīng)用程序使用,如本地化字符串,圖片,音頻等 |
| 位置管理器(Location Manager) | 提供位置服務(wù) |
| 電話管理器(Telephony Manager) | 管理所有的移動設(shè)備功能 |
| XMPP服務(wù) | 是Google在線即時交流軟件中一個通用的進(jìn)程,提供后臺推送服務(wù) |
2)Java系統(tǒng)服務(wù): 這部分系統(tǒng)服務(wù)又可以分為兩種:Java核心系統(tǒng)服務(wù)和Java硬件系統(tǒng)服務(wù)。
(1)Java核心系統(tǒng)服務(wù)是Android系統(tǒng)正常運轉(zhuǎn)的基礎(chǔ),包括大家所熟知的AMS、WMS、PMS等。例如:

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

該兩層之前,通過Binder實現(xiàn)進(jìn)程間通信。允許framework來跨進(jìn)程邊界,來調(diào)用Android的系統(tǒng)服務(wù)的代碼,這使得框架API與Android系統(tǒng)服務(wù)能夠進(jìn)行交互。
總結(jié):應(yīng)用程序---SDK---->系統(tǒng)框架層---Binder IPC--->系統(tǒng)服務(wù)層。
以app 獲取GPS信息為例:

三、native層:該層的實現(xiàn)是C/C++
開篇首張圖中,用紅線框住的均屬于該層:包括C/C++ libs 、android runtime、HAL
1)C/C++ libs:C/C++編寫的系統(tǒng)類庫
(1) 本地守護(hù)進(jìn)程
init進(jìn)程根據(jù)init.rc文件中的定義,啟動本地守護(hù)進(jìn)程。這些進(jìn)程會常駐在系統(tǒng)中,有的只會啟動一次,有的如果退出了,還會被init啟動。具體的啟動方式就在init.rc中定義。
下面大體列舉幾個守護(hù)進(jìn)程及其功能。
| 守護(hù)進(jìn)程 | 功能 |
|---|---|
| vold | 管理存儲設(shè)備,自動安裝存儲設(shè)備,將設(shè)備分區(qū)格式化 |
| netd | 管理藍(lán)牙、wifi、usb等各種網(wǎng)絡(luò)連接 |
| installd | 負(fù)責(zé)安裝及卸載軟件包,確認(rèn)軟件包的完整性 |
| rild | 接收來自于phone應(yīng)用程序或其他客戶端程序發(fā)出的調(diào)制解調(diào)控制請求,并傳遞給調(diào)制解調(diào)器 |
| adbd | 提供可以調(diào)試Android的環(huán)境 |
| servicemanager | binder通信大管家 |
| surfaceflinger | 負(fù)責(zé)android系統(tǒng)的UI圖形顯示 |
| mediaserver | 負(fù)責(zé)播放音頻、視頻,camera拍照錄像 |
(2) Native系統(tǒng)服務(wù)
由c++語言編寫,運行在本地守護(hù)進(jìn)程中。比如mediaserver守護(hù)進(jìn)程中就包含AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService和SoundTriggerHwService等服務(wù)。在所屬進(jìn)程初始化的時候會將Native系統(tǒng)服務(wù)注冊到ServiceManager中。這樣,其他的應(yīng)用或服務(wù)就可以通過binder機(jī)制調(diào)用Native系統(tǒng)服務(wù)了。 當(dāng)然,我們也可以自己開發(fā)一個Native系統(tǒng)服務(wù),實現(xiàn)其Binder接口,這樣Native層的其他應(yīng)用或服務(wù)就可以調(diào)用該服務(wù)了。 如果我們開發(fā)的Native系統(tǒng)服務(wù)想提供給Java層應(yīng)用使用,就需要實現(xiàn)一個Java接口,然后通過JNI調(diào)用Native系統(tǒng)服務(wù)。
(3) 功能性的Native類庫支持
比如:Webkit 、OpenGL ES 、SQlite等。
通過一張圖對系統(tǒng)服務(wù)有個大致了解:

2)Android Runtime: Android運行環(huán)境,對java提供支持
(1) 虛擬機(jī):Dalvik and Art(android 4.4之后)
作用:面向Linux、為嵌入式操作系統(tǒng)設(shè)計的虛擬機(jī),主要負(fù)責(zé)完成對象生命周期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等。
android為每個程序提供一個vm,可以使每個app都運行在獨立的運行環(huán)境,使穩(wěn)定性提高,并且一個vm能運行多個進(jìn)程。
android apk都被編譯成字節(jié)碼(bytecode),在運行的時候,vm是先將字節(jié)碼編譯真正可執(zhí)行的代碼,否則不同硬件設(shè)備的兼容是很大的麻煩。
(2) core libs: 核心庫提供了Java se API的多數(shù)功能,包括JNI,并提供Android的核心API,如android.os,android.net,android.media等。
- HAL 硬件抽象層 基于商業(yè)隱私考慮,對Kernel層進(jìn)行二次封裝,屏蔽數(shù)據(jù)處理細(xì)節(jié),運行于用戶空間。
鑒于商業(yè)隱私考慮,許多硬件設(shè)備廠商不希望公開其設(shè)備驅(qū)動的源代碼,如果能將android的應(yīng)用框架層與linux系統(tǒng)內(nèi)核的設(shè)備驅(qū)動隔離,使應(yīng)用程序框架的開發(fā)盡量獨立于具體的驅(qū)動程序,則android將減少對Linux內(nèi)核的依賴。HAL由此而生,它是對Linux內(nèi)核驅(qū)動程序進(jìn)行的封裝,將硬件抽象化,屏蔽掉了底層的實現(xiàn)細(xì)節(jié)。HAL規(guī)定了一套應(yīng)用層對硬件層讀寫和配置的統(tǒng)一接口,本質(zhì)上就是將硬件的驅(qū)動分為用戶空間和內(nèi)核空間兩個層面;Linux內(nèi)核驅(qū)動程序運行于內(nèi)核空間,硬件抽象層運行于用戶空間。也正是由于這個分層的原因,Android被踢出了Linux內(nèi)核主線代碼樹中。大家想想,Android放在內(nèi)核空間的驅(qū)動程序?qū)τ布闹С质遣煌暾模袻inux內(nèi)核移植到別的機(jī)器上去時,由于缺乏硬件抽象層的支持,硬件就完全不能用了,這也是為什么說Android是開放系統(tǒng)而不是開源系統(tǒng)的原因。
另外談到該層,還需要了解兩個東西:
JNI:Java Native Interface,即 Java本地接口。使得Java 與 本地其他類型語言(如C、C++)交互。JNI 是屬于 Java 的,與 Android 無直接關(guān)系。
NDK:Native Development Kit,是 Android的一個工具開發(fā)包 。快速開發(fā)C、 C++的動態(tài)庫,并自動將so和應(yīng)用一起打包成 APK 即可通過 NDK在 Android中 使用 JNI與本地代碼(如C、C++)交互。NDK是屬于 Android 的,與Java并無直接關(guān)系。

ndk可以通過native code跨過使用dalvik runtime,直接調(diào)用到android內(nèi)核資源,而sdk則需要在dalvik runtime環(huán)境下才能調(diào)用到內(nèi)核資源。然而兩者并不是各司其職,各不相關(guān)。android提供了JNI(java native interface)使兩者可以進(jìn)行相互調(diào)用和通信。
四、Kernel層:
Android以Linux操作系統(tǒng)內(nèi)核為基礎(chǔ),借助Linux內(nèi)核服務(wù)實現(xiàn)硬件設(shè)備驅(qū)動,進(jìn)程和內(nèi)存管理,網(wǎng)絡(luò)協(xié)議棧,電源管理,無線通信等核心功能。Android4.0版本之前基于Linux2.6系列內(nèi)核,4.0及之后的版本使用更新的Linux3.X內(nèi)核,并且兩個開源項目開始有了互通。Linux3.3內(nèi)核中正式包括一些Android代碼,可以直接引導(dǎo)進(jìn)入Android。Linux3.4增添了電源管理等更多功能,以增加與Android的硬件兼容性,使Android在更多設(shè)備上得到支持。直到現(xiàn)在最新的android6.0仍然繼續(xù)延用著linux3.4.0,而linux最新的版本已經(jīng)到了4.3系列,那么為什么android沒有繼續(xù)去更新Linux kernel的版本也是一個值得探討的課題。
Android內(nèi)核 對Linux內(nèi)核進(jìn)行了增強(qiáng),增加了一些面向移動計算的特有功能。例如,低內(nèi)存管理器LMK(Low Memory Keller),匿名共享內(nèi)存(Ashmem),以及輕量級的進(jìn)程間通信Binder機(jī)制等。這些內(nèi)核的增強(qiáng)使Android在繼承Linux內(nèi)核安全機(jī)制的同時,進(jìn)一步提升了內(nèi)存管理,進(jìn)程間通信等方面的安全性。下表列舉了Android內(nèi)核的主要驅(qū)動模塊:
| 驅(qū)動名稱 | 說明 |
|---|---|
| Android電源管理(Power Management) | 針對嵌入式設(shè)備的,基于標(biāo)準(zhǔn)Linux電源管理系統(tǒng)的,輕量級的電源管理驅(qū)動 |
| 低內(nèi)存管理器(Low Memory Keller) | 低內(nèi)存管理器(Low Memory Keller) 可以根據(jù)需要殺死進(jìn)程來釋放需要的內(nèi)存。擴(kuò)展了Linux的OOM機(jī)制,形成獨特的LMK機(jī)制 |
| 匿名共享內(nèi)存(Ashmem) | 為進(jìn)程之間提供共享內(nèi)存資源,同時為內(nèi)核提供回收和管理內(nèi)存的機(jī)制 |
| 日志(Android Logger) | 一個輕量級的日志設(shè)備 |
| 定時器(Anroid Alarm) | 提供了一個定時器用于把設(shè)備從睡眠狀態(tài)喚醒 |
| 物理內(nèi)存映射管理(Android PMEM) | DSP及其他設(shè)備只能工作在連續(xù)的物理內(nèi)存上,PMEM用于向用戶空間提供 連續(xù)的物理內(nèi)存區(qū)域映射 |
| Android定時設(shè)備(Android Timed device) | 可以執(zhí)行對設(shè)備的定時控制功能 |
| Yaffs2文件系統(tǒng) | Android采用大容量的NAND閃存作為存儲設(shè)備,使用Yaffs2作為文件系統(tǒng)管理大容量MTD NAND Flash;Yaffs2占用內(nèi)存小,垃圾回收簡潔迅速。 |
| Android Paranoid網(wǎng)絡(luò) | 對Linux內(nèi)核的網(wǎng)絡(luò)代碼進(jìn)行了改動,增加了網(wǎng)絡(luò)認(rèn)證機(jī)制??稍贗PV4,IPV6和藍(lán)牙中設(shè)置,由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