版權聲明:本文為作者原創,轉載必須注明出處。
轉載請注明出處: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等。
- 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