這裏寫一些關於Android Framework比較重要的知識點,這些東西對於以後理解和研究Android Framework有很大好處,就是讓咱們腦子裏先有一個大概的模型,以及認識一點以後常常會遇見的角色。
首先貼一張圖,剛學安卓的時候看書籍或者看視頻教程的時候一般第一篇就會祭出這張圖,可是當時你可能就是一瞥而過,畢竟初學時通常只關心應用層功能的實現啊,或者如何佈局啊這些,如今來複習一下這張很重要的圖:java
圖上分的很清楚,分爲四層,分別爲:linux
1.應用程序層
這一層通常咱們最爲熟悉了,咱們日常開發安卓用java編寫的app都屬於這一層,固然系統自帶的程序好比時鐘啊,email等都是屬於這一層
2.應用程序框架層(Framework)
這一層是核心應用程序所使用的API框架,爲應用層提供各類接口API,包括各類組件和服務來支持咱們的安卓開發,包括ActivityManager,WindowManager,ViewSystem等咱們講到AndroidFramework時很常常要提到的東西。
3.系統運行庫層
從圖上就能夠看出,這一層有兩部分:
一.程序庫
Android 包含一些C/C++庫,這些庫能被Android系統中不一樣的組件使用。它們經過 Android 應用程序框架爲開發者提供服務。如下是一些核心庫:
系統 C 庫 - 一個從 BSD 繼承來的標準 C 系統函數庫( libc ), 它是專門爲基於 embedded linux 的設備定製的。
媒體庫 - 基於 PacketVideo OpenCORE;該庫支持多種經常使用的音頻、視頻格式回放和錄製,同時支持靜態圖像文件
編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
LibWebCore - 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。
SGL - 底層的2D圖形引擎
3D libraries - 基於OpenGL ES 1.0 APIs實現;該庫可使用硬件 3D加速(若是可用)或者使用高度優化的3D軟加速。
FreeType -位圖(bitmap)和矢量(vector)字體顯示。
SQLite - 一個對於全部應用程序可用,功能強勁的輕型關係型數據庫引擎。
二.Android 運行庫(Android Runtime)
Android 包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數功能。
每個Android應用程序都在它本身的進程中運行,都擁有一個獨立的Dalvik虛擬 機實例。Dalvik被設計成一個設備能夠同時高效地運行多個虛擬系統。 Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該格式文件針對小內存使用作了 優化。同時虛擬機是基於寄存器的,全部的類都經由JAVA編譯器編譯,而後經過SDK中 的 「dx」 工具轉化成.dex格式由虛擬機執行。
Dalvik虛擬機依賴於linux內核的一些功能,好比線程機制和底層內存管理機制。
4.Linux內核層
安卓系統基於Linux內核這個咱們都知道,Android 的核心繫統服務依賴於 Linux 2.6 內核,如安全性,內存管理,進程管理, 網絡協議棧和驅動模型。 Linux 內核也同時做爲硬件和軟件棧之間的抽象層。
接下來咱們講講Framework框架,框架中包含了3個主要部分:1.服務端 2.客戶端 3.Linux驅動
先說一下服務端一些重要的東西:
1.ActivityManagerService(Ams):管理全部應用程序中的Activity,他掌握全部Activity的狀況,全部具備調度Activity生命週期的能力,簡而言之,它就是管理和掌控全部的Activity.
2.WindowManagerService(Wms):控制窗口的顯示與隱藏以及窗口的層序,簡而言之,就是它是管理窗口的,能夠知道大多數和View有關係的都要跟他打交道。
3.KeyQ類:它是Wms的一個內部類,一旦建立就會啓動一個新線程,這個線程會不斷的接收讀取用戶的UI操做消息,並把這些消息放到消息隊列QueueEvent中。
4.InputDispatcherThread類:該類也是一旦建立就會啓動一個線程,這個線程會不斷的從上面的QueueEvent中取出用戶的消息,進行必定的過濾,再講這些消息發送給當前活動的客戶端程序中。
再說一些客戶端比較重要的東西:
1.ActivityThread類:主線程類,即UI線程類,咱們程序的入口就是從他的main()函數入口的。也是客戶端與AMS交互的一個最主要的類:內部有ApplicationThread類(繼承IBinder)負責與AMS跨進程通訊,又有H類(繼承自Handler類),負責接收ApplicationThread發來的消息,實現把消息傳到主線程。
2.ViewRoot類:很重要的一個類,負責客戶端與WMS的交互:內部有W類,W類繼承於Binder,因此他與ApplicationThread的角色是差很少的,只不過他對應的是Wms,當Wms想與客戶端進行通訊的時候,Wms就調用這個類。內部又有ViewRootHandler類繼承於Handler,因此他能在W類接收到Wms的消息後,把這個消息傳送到UI線程中。同時界面繪製的發起點也是在這裏面:performTraversals()。
3.Activity類:這個咱們再熟悉不過了,APK運行的最小單位。
4.PhoneWindow類:繼承自Window類,它裏面會放一個DecorView,它提供了一組統一窗口操做的API.
5.DecorView類:這是咱們所能看到的View的全部,它繼承自FrameLayout,咱們寫的佈局view就是放在他這個裏面。
6.ApplicationThread類:繼承於Binder,當Ams想與客戶端通訊時(即調用客戶端的方法),Ams調用的就是這個類。
7. Instrumentation類:負責直接與Ams對話,好比當客戶端想與Ams進行通訊時(即調用Ams服務裏的方法),都是他去實現單項調用Ams,即他至關於於一個管家,全部想調Ams的操做都集中到他這兒,他負責單向調用Ams.
Manager機制:
服務端有不少各類各樣的系統服務,當咱們客戶端每次想調用這些服務時(IPC)若是每次都是想要哪個服務就直接去調用哪個服務的話,顯然顯得比較雜亂且拓展性較差,因此安卓採用了這種Manager機制,即設置一個相似經理的東西,也就是Manager,他自己也是一個服務,他管理着全部其餘的服務,也就是說咱們須要哪一個服務要先通過他,他負責爲咱們去調用這個服務,因此這樣就只給咱們暴露一個經理這個服務,其餘的服務被他屏蔽了,對咱們來講是透明的,這和java的封裝很像。
Android Framework的三大核心功能:
一、View.java: View工做原理,實現包括繪製view、處理觸摸、按鍵事件等。
二、ActivityManagerService.java :Ams 管理全部應用程序的Activity 等 。
三、WindowManagerService.java :Wms 爲全部應用程序分配窗口,並管理這些窗口。
最後,由於每一個Binder都會對應一個線程,因此一個含Activity的程序最少也有3個線程,分別是:1.UI主線程 2.ApplicationThread(Binder) 3.ViewRoot.W(Binder).
總結:FramWork是給上層應用app層提供api方法和服務的應用框架層,能夠稱Framework層才真正是Java語言實現的層,包括三大核心功能viewsystem,ActivityManagerService.java,WindowManagerService.java ,正式由於framwork層裏面的jni(java本地服務)和系統運行層裏面的c++庫的交互,因此纔會從C/C++的底層慢慢向上變成了JAVA的開發語言c++