一 . Android 系統架構
Android是一個包括操作系統,中間件和關鍵應用的移動設備軟件堆;
作為一個開源的軟件,android包含了眾多的功能和龐大的代碼,他的代碼基於linux。
1. Android系統架構圖
2. Android 軟件架構介紹
Android系統架構和其操作系統一樣,采用了分層的架構。
從架構圖看,Android系統架構分為四個層,從高層到低層分別為:
- 應用程序層
- 應用程序框架層
- 系統運行庫層
- linux核心層
各層之間的聯系:
- Android的第一層是有C語言實現,第二層由C和C++實現,第3、4層主要是有java實現的。
- 第1、2層之間,從linux的操作系統的角度來看,是由內核和用戶空間的分界線,
- 第2、3層之間是本地代碼層和java代碼層的接口。
- 第3、4層之間,是android的系統API的接口。
- 第一層運行與內核空間,第2、3、4運行與用戶空間。
3. 應用程序層
Android會同一系列核心應用程序包一起發布,該應用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。
所有的應用程序都是使用JAVA語言編寫的。
4. 應用程序框架層
開發人員可以完全訪問核心應用程序所使用的API框架。
隱藏在每個應用后面的是一系列的服務和系統, 其中包括:
- 豐富而又可擴展的視圖(Views),可以用來構建應用程序, 它包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。
- 內容提供器(Content Providers)使得應用程序可以訪問另一個應用程序的數據(如聯系人數據庫), 或者共享它們自己的數據
- 資源管理器(Resource Manager)提供 非代碼資源的訪問,如本地字符串,圖形,和布局文件( layout files )。
- 通知管理器 (Notification Manager) 使得應用程序可以在狀態欄中顯示自定義的提示信息。
- 活動管理器( Activity Manager) 用來管理應用程序生命周期並提供常用的導航回退功能。有關更多的細節和怎樣從頭寫一個應用程序,請參考 如何編寫一個 Android 應用程序.
等等。
5. 系統運行庫層
Android系統架構 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架為開發者提供服務。
以下是一些核心庫:
- 系統 C 庫 : 一個從 BSD 繼承來的標准 C 系統函數庫( libc ), 它是專門為基於 embedded linux 的設備定制的。
- 媒體庫 : 基於 PacketVideo OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG。
- Surface Manager : 對顯示子系統的管理,並且為多個應用程序提 供了2D和3D圖層的無縫融合。
- LibWebCore : 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。
- SGL : 底層的2D圖形引擎
- 3D libraries : 基於OpenGL ES 1.0 APIs實現;該庫可以使用硬件 3D加速(如果可用)或者使用高度優化的3D軟加速。
- FreeType :位圖(bitmap)和矢量(vector)字體顯示。
- SQLite : 一個對於所有應用程序可用,功能強勁的輕型關系型數據庫引擎。
6. linux核心層
Android 的核心系統服務依賴於 Linux 2.6 內核,如安全性,內存管理,進程管理, 網絡協議棧和驅動模型。
Linux 內核也同時作為硬件和軟件棧之間的抽象層。
二 . Framework 啟動過程
Android啟動過程包含從Linux內核加載到Home應用程序啟動的整個過程。
整體流程如下:
1. android是基於linux內核的系統平台。啟動時,首先通過bootloader(系統加載器),加載Linux內核。在Linux加載啟動時,與普通的Linux啟動過程相同,先初始化內核,然后調用init進程。
2. Init進程啟動zygote:
解析配置文件:init.rc(系統配置文件)及initXXX.rc(與硬件平台相關的文件)的內容執行一系列的命令,包括創建mount目錄,安裝文件系統,設置屬性,啟動屬性服務器,啟動Socket服務端口 --> 加載preload-classes和preload-resources(Framework大部分類及資源)--> fork啟動新的進程Zygote(其實是由fork和execv共同創建)。
3. Zygnote孵化第一個進程SystemServer,SystemServer啟動各種系統服務線程。
SystemServer進程在Android的運行環境中扮演了"神經中樞"的作用,APK應用中能夠直接交互的大部分系統服務都在該進程中運行,常見的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)等,這些系統服務都是以一個線程的方式存在於SystemServer進程中。SystemServer的main()函數首先調用的是init1()函數,這是一個native函數,內部會進行一些與Dalvik虛擬機相關的初始化工作。該函數執行完畢后,其內部會調用Java端的init2()函數,該函數首先創建了一個ServerThread對象,該對象是一個線程,然后直接運行該線程,於是,從ServerThread的run()方法內部開始真正啟動各種服務線程。
基本上每個服務都有對應的Java類,從編碼規范的角度來看,啟動這些服務的模式可歸類為三種:模式一是指直接使用構造函數構造一個服務,由於大多數服務都對應一個線程,因此,在構造函數內部就會創建一個線程並自動運行。模式二是指服務類會提供一個getInstance()方法,通過該方法獲取該服務對象,這樣的好處是保證系統中僅包含一個該服務對象。模式三是指從服務類的main()函數中開始執行。無論以上何種模式,當創建了服務對象后,有時可能還需要調用該服務類的init()或者systemReady()函數以完成該對象的啟動
4. 當以上服務線程都啟動后,AMS以systemReady調用完成最后啟動,mMainStack.resumeTopActivityLocked(null)-》mService.startHomeActivityLocked啟動第一個Activity。至此,FrameWork 的啟動完成。
三. 學習Framework 要知道的重點
1. Init
2. Zygnote
3. ActivityManagerService
4. PackageManagerService
5. WindowManagerService
6. PowerManagerService
7. InputMethodManagerService
8. NetworkManagementService
9. MountService
10. NotificationManagerService
11. Binder
更多SystemServer見下表
服務類名稱 |
作用描述 |
啟動模式 |
EntropyService |
提供偽隨機數 |
1.0 |
PowerManagerService |
電源管理服務 |
1.2/3 |
ActivityManagerService |
最核心的服務之一,管理Activity |
自定義 |
TelephonyRegistry |
通過該服務注冊電話模塊的事件響應,比如重啟、關閉、啟動等 |
1.0 |
PackageManagerService |
程序包管理服務 |
3.3 |
AccountManagerService |
賬戶管理服務,是指聯系人賬戶,而不是Linux系統的賬戶 |
1.0 |
ContentService |
ContentProvider服務,提供跨進程數據交換 |
3.0 |
BatteryService |
電池管理服務 |
1.0 |
LightsService |
自然光強度感應傳感器服務 |
1.0 |
VibratorService |
震動器服務 |
1.0 |
AlarmManagerService |
定時器管理服務,提供定時提醒服務 |
1.0 |
WindowManagerService |
Framework最核心的服務之一,負責窗口管理 |
3.3 |
BluetoothService |
藍牙服務 |
1.0+ |
DevicePolicyManagerService |
提供一些系統級別的設置及屬性 |
1.3 |
StatusBarManagerService |
狀態欄管理服務 |
1.3 |
ClipboardService |
系統剪切板服務 |
1.0 |
InputMethodManagerService |
輸入法管理服務 |
1.0 |
NetStatService |
網絡狀態服務 |
1.0 |
NetworkManagementService |
網絡管理服務 |
NMS.create() |
ConnectivityService |
網絡連接管理服務 |
2.3 |
ThrottleService |
暫不清楚其作用 |
1.3 |
|
|
|
AccessibilityManagerService |
輔助管理程序截獲所有的用戶輸入,並根據這 些輸入給用戶一些額外的反饋,起到輔助的效果 |
1.0 |
MountService |
掛載服務,可通過該服務調用Linux層面的mount程序 |
1.0 |
NotificationManagerService |
通知欄管理服務,Android中的通知欄和狀 態欄在一起,只是界面上前者在左邊,后者在右邊 |
1.3 |
DeviceStorageMonitorService |
磁盤空間狀態檢測服務 |
1.0 |
LocationManagerService |
地理位置服務 |
1.3 |
SearchManagerService |
搜索管理服務 |
1.0 |
DropBoxManagerService |
通過該服務訪問Linux層面的Dropbox程序 |
1.0 |
WallpaperManagerService |
牆紙管理服務,牆紙不等同於桌面背景, 在View系統內部,牆紙可以作為任何窗口的背景 |
1.3 |
AudioService |
音頻管理服務 |
1.0 |
BackupManagerService |
系統備份服務 |
1.0 |
AppWidgetService |
Widget服務 |
1.3 |
RecognitionManagerService |
身份識別服務 |
1.3 |
DiskStatsService |
磁盤統計服務 |
1.0 |