1. 程式人生 > >淺談Android FrameWork框架和它在android的四層架構起到的作用

淺談Android FrameWork框架和它在android的四層架構起到的作用

這裡寫一些關於Android Framework比較重要的知識點,這些東西對於之後理解和研究Android Framework有很大好處,就是讓我們腦子裡先有一個大概的模型,以及認識一點之後經常會碰見的角色。
首先貼一張圖,剛學安卓的時候看書籍或者看視訊教程的時候通常第一篇就會祭出這張圖,但是當時你可能就是一瞥而過,畢竟初學時一般只關心應用層功能的實現啊,或者如何佈局啊這些,現在來複習一下這張很重要的圖:

圖上分的很清楚,分為四層,分別為:

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的三大核心功能:
1、View.java: View工作原理,實現包括繪製view、處理觸控、按鍵事件等。
2、ActivityManagerService.java :Ams 管理所有應用程式的Activity 等 。
3、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++的底層慢慢向上變成