Android Framework解析
眾所周知,Android是一個基於Linux實現的作業系統。但對於Linux核心來說,Android也僅僅只是一個執行在核心之上的應用程式,與其他執行在核心之上的應用程式沒有任何區別。所以Android也需要執行環境,需要Linux核心在啟動完成後載入Android Framework執行所需要的資源。當Framework完成初始化後才能繼續啟動相應的APK應用程式。
Framework啟動分析
Framework執行的第一個Java虛擬機器程序為zygote(對應具體程式為app_process,該程式位於system/bin目錄下),zygote是APK應用程式的父程序,此後所有的虛擬機器程序都由zygote建立。
zygote有兩個功能:
1.接受請求建立新的Dalvik程序
2.共享類和資源(需要載入的資源在preload-classes文字檔案中宣告)

Dalvik虛擬機器程序間的關係
對於Android來說,每一個應用程式對應著一個Linux 程序,每一個程序都是一個Dalvik虛擬機器,Dalvik虛擬機器是一種類似Java虛擬機器的實現。
zygote程序在啟動時會預先裝載共享類和共享資源,這些類及資源實際上就是SDK中定義的大部分類和資源。當zygote程序建立新程序時,新的APK程序只需裝載自身類和資源即可。共享的資源位於同一段實體記憶體空間中,zygote程序及其建立的Dalvik程序都可以訪問,這就解決了多個APK共享Framework資源的問題。(更多關於資源的討論請看 ofollow,noindex">Android資源載入機制詳解 )
zygote建立的第一個程序名為SystemServer,SystemServer建立了一個Socket客戶端,並建立了ActivityManagerService執行緒來管理該客戶端。之後所有的Dalvik程序都是由該客戶端啟動的。當需要啟動新的APK程序時,AmS會通過該Socket客戶端向zygote程序的Socket服務端傳送一個啟動命令,然後zygote就會建立(使用 fork() 建立新程序)出新的應用程式程序。
系統服務
SystemServer程序內部執行著APK應用中能夠直接互動的大部分系統服務。比如WindowManagerService(簡稱WmS),ActivityManagerService(簡稱AmS),PackageManagerService(簡稱PmS)等。這些系統服務都是以一個執行緒的方式生存在SystemServer程序中。SystemServer啟動的各種服務執行緒如下所示:
- PowerManagerService電源管理服務
- ActivityManagerService管理Activity
- PackageManagerService程式包管理服務
- BatteryService電池管理服務
- LightService自然光強度感應感測器服務
- VibratorService震動感測器服務
- ClipboardService剪下板服務
- NetworkManagerService網路管理服務
- InputMethodManagerService輸入法管理服務
- BluetoothService藍芽服務
- ...
Dalvik與Android Runtime(ART)
Dalvik是一種類Java虛擬機器的實現,其執行的是class優化後的dex位元組碼檔案。Dalvik通過一個JIT(Just-In-Time)編譯器去解釋位元組碼,但執行效率並不理想。
自動Android 4.4後安卓就內建了ART實現,從5.0開始更是直接拋棄了Dalvik全面使用ART。ART通過AOT機制(Ahead-Of-Time)在應程式安裝時將位元組碼編譯成機器語言,因此執行速度更快。並且ART也完全相容Dalvik。
應用程式啟動分析
在計算機的世界裡每個程式都有一個main()方法,程式程式碼都是從main()方法開始執行,Android應用程式也不例外。
當應用程式啟動時系統首先會為其建立一個Dalvik虛擬機器程序,並載入APK應用程式類及資源。然後,APK應用程式從ActivityThred的main()方法處開始執行。
首先main()方法為UI執行緒建立一個訊息佇列(MessageQueue)。然後建立ActivityThread物件,ActivityThread初始化時會建立一個Handler和一個Binder。Binder負責接收遠端AmS的IPC呼叫,接收到呼叫後通過Handler將訊息傳送到訊息佇列,UI主執行緒會非同步地從訊息佇列中取出訊息並執行相應操作,比如start,stop,pause等。
接著UI主執行緒呼叫Looper.loop()方法進入訊息迴圈體,進入後就會不斷從訊息佇列中讀取並處理訊息。
ActivityThread是APK程式的UI執行緒,也就是我們所說的主執行緒。主執行緒要求執行時間不能超過5秒,超過就會報ANR,這個5秒就是UI執行緒訊息佇列迴圈一次的最大時間閾值。
當ActivityThread接收到AmS傳送的start某個Activity訊息後,就會建立指定Activity物件。Activity又會建立PhoneWindow類,PhoneWindow建立DecorView,DecorView內部包含Activity.setContentView(R.layout.xxx)指定的佈局。
建立完成後,Activity需要將佈局顯示在螢幕上,於是呼叫WindowManager.addView()方法。WindowManager為Activity對應的視窗(Window)建立一個ViewRoot物件(每一個視窗對應一個ViewRoot物件),然後呼叫WmS提供的遠端介面將視窗(佈局)顯示到螢幕上。至此應用程式中的Activity就顯示在螢幕上了。
APK中的執行緒
在現在作業系統中,任何應用程式都執行線上程之中。客戶端在啟動時系統會首先為其分配一個執行緒,然後該執行緒從程式的入口處開始執行。對於包含Activity的客戶端程式,至少包含三個執行緒:
- 主執行緒,又稱UI執行緒,也就是應用程式本身所在的執行緒,主要用於處理使用者訊息以及繪製程式介面。
- ViewRoot.W物件對應的執行緒,Activity啟動後會建立一個ViewRoot.W物件,W物件繼承自Binder,因此會啟動一個物件負責接收Linux Binder驅動的IPC呼叫。
- ApplicationThread物件所對應的執行緒,該物件也繼承自Binder,因此也會啟動一個執行緒用於IPC呼叫。
自定義Thread與UI執行緒的區別
對於UI執行緒,在啟動時已經建立了訊息佇列(MessageQueue),既在ActivityThread的main()方法中已經使用Looper.prepareMainLooper()方法為UI執行緒添加了Looper物件。程式設計師可以直接在Activity中定義Handler物件傳送處理訊息。
而對於普通執行緒,需要手動呼叫Looper.prepareLooper()方法為Thread建立訊息佇列,這樣才能定義Handler處理訊息。即不能直接在Thread中定義Handler。
從使用場景上說,就是不能直接給Thread物件發訊息,但是卻可以給UI執行緒發訊息。
具體Handler的使用及解釋請移步 Android非同步通訊機制詳解
一些重要的類:
下面是一些系統中常見的類及其功能介紹,通讀一遍會對理解Android原始碼很有幫助。
兩個重要的系統服務
- WindowManagerService,管理所有的視窗,包括建立刪除視窗,隱藏顯示視窗,決定視窗的層級順序,指定當前正在與應用程式互動的視窗。
- ActivityManagerService,記憶體管理,程序管理,統一排程所有應用程式中的Activity。所有Activity的啟動必須通知AmS,AmS也決定了某個程序會不會被殺死。
兩個訊息處理類
- KeyQ類:該類是WmS的內部類,繼承自KeyInputQueue,一旦建立就立即啟動一個執行緒,該執行緒會不斷讀取使用者UI操作訊息,比如按鍵、觸控式螢幕、等,並把這些訊息放到一個訊息佇列QueueEvent類中。
- InputDispatcherThread類:該類一旦建立也會啟動一個執行緒,該執行緒會不斷地從QueueEvent中讀取使用者訊息,並進行一定的過濾,過濾後傳送給當前活動的而應用程式中。
其他常用類
- ActivityThread類,應用程式主執行緒類,所有的APK都有且僅有一個ActivityThread類,程式的入口為該類中的static main()方法,ActivityThread所在的執行緒即為UI執行緒或主執行緒。
- ViewRoot類,WmS管理客戶端視窗時,需要通知客戶端進行某種操作,這些都是通過IPC呼叫來完成的,而客戶端在接收到IPC後,都需要將該呼叫轉換成本地非同步呼叫。ViewRoot繼承自Handler,其作用就是將遠端介面呼叫轉換成本地非同步呼叫。
- W類,ViewRoot內部類,繼承自Binder,Wms通知客戶端時就是該類進行IPC呼叫。該類內部會向其所在的ViewRoot傳送一個Handler訊息,以便進行非同步處理。
- Window類,是一個抽象類,提供了一套操作視窗的通用方法(Callback介面)。Activity就是通過實現這個Callback介面來獲得對訊息的處理機會。因為訊息首先會由WmS傳遞給視窗中的View樹,View樹不處理訊息的話才會傳遞給Window,這時候就會回撥Activity實現的Callback方法使Activity有機會處理事件。
- PhoneWindow類,是Window的具體實現類,其內部儲存有DecorView物件。
- DecorView類,應用程式檢視的根佈局View,該類繼承自FrameLayout。客戶端使用WindowManager新增視窗就是將該類(及其子View)新增到WmS中,並將其所代表的檢視繪製到螢幕上。
- Activity類,該類APK程式最小執行單元。ActivityThread根據使用者的操作選擇載入哪個Activity。
- WindowManager類,該類是WindowManagerService在客戶端的管理類,客戶端通過WindowManager申請建立一個視窗,而具體建立視窗的任務是由WMS來完成的。
參考資料
ART無縫替換Dalvik虛擬機器