一、爲什麼要學習Android內核
做Android應用以來,但是總感覺蒙了一層霧,爲什麼是activity的生命週期是這樣?爲什麼要分UI線程和其他線程?Android和Linux有什麼區別?
我想要知其所以然,而不是天天學習搬磚,語言技術總是在變,程序員總要抓住其中不變的內涵。
因此,Android內核和源碼學習之路開始了,既是總結以前看過的Android知識,也是督促自己繼續深造。
廢話到此,開始!
二、Android的系統架構圖
每一個Android學習者總是要先看這張圖的,這張圖雖然簡單,但是每個層次的開發者總能看到不一樣的內涵
上圖從上往下分爲:(1)應用程序層(2)應用程序框架層(3)系統運行庫層(4)硬件抽象接口層 (5)Linux內核層。
在開發應用的Android程序員看來,應該最關注第一、二層;更資深一點的程序員眼裏應該會關注第三層(NDK開發);大牛級別的Android開發者,比如手機廠商的定製Android系統的人員,則會關注第四層。
其實這張圖應該叫做邏輯系統架構圖,因爲從源代碼工程上沒有劃分層次的說法。
總之,正是應了一千個XXX有一千個XXX的那句話,每個級別的程序員關注的、看到的都不一樣。
三、Android的應用程序框架層詳解
Android系統使用的是Linux內核,實際上Android只是在Linux內核之外加上了很多Android特有的東西:比如特定硬件的驅動、Android的類庫、一些服務、JAVA運行時等等等等。
其中第二層,應用程序框架層是從事Android開發的基礎,很多核心應用程序也是通過這一層來實現其核心功能。那麼理解這一層對於理解Android系統的設計思想是很有幫助的。如圖所示,這一層提供很多服務(不止下面介紹的),解析如下:
(1) ActivityManager(活動管理器): 管理各個應用程序生命週期以及通常的導航回退功能。
(2) WindowManager(窗口管理器):管理所有的窗口程序
(3) ContentProvider(內容提供器):使得不同應用程序之間存取或者分享數據
(4) ViewSystem(視圖系統):構建應用程序的基本組件
(5) NotificationManager(通告管理器):使應用程序可以在狀態欄中顯示提示信息
(6) PackageManager(包管理器) :Android系統內的程序管理
(7)TelephonyManager(電話管理器):管理所有的移動設備通話相關功能
(8)ResourceManager(資源管理器):提供應用程序使用的各種非代碼資源,如本地化字符串、圖片、佈局文件、顏色文件等
(9)LocationManager(位置管理器):提供位置服務
(10)XMPPService(XMPP服務):提供GoogleTalk服務 (可以做消息推送)
注:可能有人問了,爲什麼我把這些什麼什麼器叫做服務?其實從兩個方面可以解答:
a) Android系統的啓動過程中就把這些東西叫做服務;
b)從編程角度來看,你要獲得上面一個什麼什麼器都是用這樣的語句(這個是獲取窗口,其他的都類似):
WindowManager mManager=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
從語句上來看getSystemService不正是獲取服務的意思嗎?
四、Android的系統運行庫層詳解
1、系統庫
系統庫是應用程序框架的支撐,是連接應用程序框架層與Linux內核層的重要紐帶。其主要分爲如下幾個(還有更多):
(1)SurfaceManager:執行多個應用程序時候,負責管理顯示與存取操作間的互動,另外也負責2D繪圖與3D繪圖進行顯示合成。
(2)MediaFramework: 多媒體庫,基於PacketVideoOpenCore;支持多種常用的音頻、視頻格式錄製和回放,編碼格式包括MPEG4、MP3、H.264、AAC、ARM。
(3)SQLite:存儲在本地的小型的關係型數據庫引擎
(4)OpenGL|ES:根據OpenGL ES1.0API標準實現的3D繪圖函數庫
(5)FreeType:提供點陣字與向量字的描繪與顯示
(6)WebKit:一套網頁瀏覽器的軟件引擎
(7)SGL:底層的2D圖形渲染引擎
(8)SSL:在Andorid上通信過程中實現加密
(9)Libc:標準C系統函數庫(包含C語言最基本的函數庫)
2、Android運行時
Android應用程序時採用Java語言編寫,程序在Android運行時中執行,其運行時分爲核心庫和Dalvik虛擬機兩部分。
(1)核心庫:核心庫提供了Java語言API中的大多數功能,同時也包含了Android的一些核心API,如android.os、android.net、android.media等等。
(2)Dalvik虛擬機:每個Android應用程序都有一個專有的Dalvik進程,並且不是多個程序運行在一個虛擬機中,而是每個Android程序都有一個Dalivik虛擬機的實例,並在該實例中執行。Dalvik虛擬機是一種基於寄存器的Java虛擬機,而不是傳統的基於棧的虛擬機,並進行了內存資源使用的優化以及支持多個虛擬機的特點。Dalvik虛擬機中執行的並非編譯後的字節碼,而是通過轉換工具dx將Java字節碼轉成dex格式的中間碼。
五、Android的硬件抽象層HAL
Android的硬件抽象層,簡單來說,就是對Linux內核驅動程序的封裝,向上提供接口,屏蔽低層的實現細節。
六、Android的Linux內核層
早期的Android採用了Linux 2.3內核,最新的Android 5.0基於Linux 3.1,各大手機廠商訂製的Android系統基於的Linux內核就看心情了(小米的是3.3)。
七、小結與下一篇
這一篇主要介紹了Android的層次結構,從宏觀上了解系統的組成架構。下一篇將講解如何獲取Android源碼,並結合源碼詳細解析Android系統的啓動過程。