1、 Android平臺各層html
Android平臺架構圖,以下圖:由上到下依次爲應用程序、應用程序框架、庫、Android運行時、Linux內核。java
一、Linux內核:android
Android系統基於Linux內核,可是Android不是Linux。沒有本地的窗口系統。沒有glibc庫的支持。不包括完整的標準Linux工具集。標準的Linux 2.6.24內核。內核加強補丁來支持Android。git
(1) Linux內核具備強大的內核和進程管理。基於權限的安全模型。可靠的驅動模型。支持共享庫。已是開源的。 數據庫
(2)內核加強: Alarm, Ashmem, Binder, Power Management, Low Memory Killer, Kernel Debugger, Logger 後端
Binder(IPC)驅動介紹瀏覽器
問題: 應用和服務會運行在各自的進程當中,而進程之間必需要通訊和共享數據。而IPC(進程間通訊)會引入巨大的處理開銷和安全漏洞。 安全
解決方法: 使用驅動來協助進程間通訊(IPC)。經過共享內存來得到高性能。對於處理請求,每一個進程一個線程池。引用計數,對象的引用是跨進程映射的。進程之間是同步調用。 服務器
Binder的實現機制以下圖所示: 網絡
Android的接口定義語言(AIDL)見:http://developer.android.com/guide/components/aidl.html
PowerManager介紹
問題: 移動設備是依賴電池供電來運行的,電池只有有限的容量。
解決方法: 基於Linux的功率管理(PM)構建更增強大的功率管理策略經過"wake locks"來進行功率管理支持不一樣類型的wake locks。
Android中的PM實現: 以下圖中所示
Android內核源碼能夠經過以下http://git.android.com獲取
2 、本地庫
本地庫包括: Bionic Libc, Function Libraries, Native Servers, Hardware Abstraction Libraries
(1)Bionic:定製的libc實現,優化用於嵌入式。
爲何選用Bionic? 爲何要構建一個定製的libc庫呢?
主要從以下方面考慮:
許可證:從用戶角度,保持GPL許可。
大小:因爲將加載到各個進程,因此須要比較小。
速率:有限的CPU能力意味着咱們須要足夠的快。
對於Bionic libc: BSD許可小而快的代碼路徑很是快和小的定製的pthread實現內置支持重要的特定Androud服務,像
1)系統屬性,getprop(my.system.property, buff, default);
2)log能力,LOGI(Logging a message with priority 'Info' );不支持某些POSIX特性。與GNU Libc(glibc)不兼容。因爲Native代碼必須依賴bionic來進行編譯。
(2)功能庫(Function Libraries)
[1]WebKit :基於開源的WebKit瀏覽器:在全視圖渲染頁徹底支持CSS,Javascript,DOM,AJAX支持單列和自適應的視圖渲染 。
[2]Media Framework: 基於PacketVideo公司的OpenCORE平臺。支持多種音頻、視頻、圖像文件。
[3]SQLite:輕量級事務性數據存儲,是大多數平臺的後端數據存儲 ,是輕量級關係數據庫引擎。
(3)Native Servers 主要有兩大類Surface Flinger(Surface Manager)和Audio Flinger (Audio Manager)
[1]Surface Flinger:提供系統範圍的外觀「組合器」,處理全部的外觀渲染到幀buffer設備中。能夠結合2D與3D外觀和多個應用的外觀。Surfaces傳遞是做爲Buffer來經過Binder IPC調用。可使用OpenGL ES和2D硬件加速器做爲其組成部分。使用page-flip的雙buffer機制。
管理多個應用程序同時執行,各個應用程序之間的顯示與存取,而且爲多個應用程序提供2D和3D圖層的無縫融合。
以下圖展現所示
[2]Audio Flinger: 管理全部的audio輸出設備。處理多個audio流到PCM audio 輸出路徑。處理audio路由到各個輸出。
以下圖示意
(4)硬件抽象層(Hardware Abstraction Libraries,HAL) ,在Android系統層次結構中的位置,以下圖所示。
該層具備以下特色: 用戶空間C/C++庫層。定義了接口,以便讓Android請求硬件「驅動」來實現。分離了Android平臺邏輯和硬件接口。
那麼爲何在Android中須要一個用戶空間的HAL呢?
主要有以下緣由: 不是全部的組件具備標準的內核驅動接口;內核驅動是GPL的,其將暴露了全部的知識產權;Android對於硬件驅動具備特定的要求。 HAL Header例子:
// must be provided by each Acme hardware implementation typedef struct { int (*foo)( void ); char (*bar)( void ); … } AcmeFunctions; const AcmeFunctions *Acme_Init(const struct Env *env, int argc, char
**argv);
庫在runtime時按需動態加載
(1) 核心庫(Core Libraries):包括Java語言所須要的基本函數以及Android的核心庫。與標準Java不同的是,系統爲每一個應用程序提供單獨的Dalvik虛擬機執行,即每一個應用程序擁有本身單獨的線程。Java語言的Core APIs提供了功能強大的,而且簡單和熟悉的開發平臺。數據結構(Data Structure)工具(Utilities)文件訪問(File Access)網絡訪問(Network Access)圖形(Graphics)...
(2)Dalvik虛擬機: 是Android中定製的淨化實現的虛擬機。大多數虛擬機(包括JVM)都是基於棧的,Dalvik虛擬機是基於寄存器的。
因爲以下特色:
[1]提供了應用程序的可移植性和運行時的一致性;
[2]運行優化的文件格式(.dex)和Dalvik字節;
[3]Java .class/ .jar文件在構建時轉換爲.dex格式 ;
[4]Dalvik設計用於嵌入式環境;
[5]在每一個設備上支持多個虛擬機進程;
[6]高度優化CPU的字節碼解釋器;
[7]高效的使用runtime內存。
4. 應用框架(Application Frameworks)
對於開發人員來說,接觸最多的便是該層。
(1)核心平臺服務(Core Platform Services)
具備以下特性: 對於Android平臺來講,服務(Services)是必需的。在後臺 —— 應用不會直接訪問它們。
主要平臺服務: Activity Manager,Package Manager,Window Manager,Resource Manager,Content Providers,View System
(2)硬件服務(Hardware Services) 提供訪問底層的硬件APIs。典型地經過局部的Manager對象來訪問。
例如:LocationManager lm = (LocationManager)Context.getSystemService(Context.LOCATION_SERVICE);
五、Applications(應用程序層)
本層全部應用程序都用java編寫,通常狀況下,不少應用程序都是在同一系列的核心應用程序包中一塊兒發佈的。
主要包括:撥號程序、瀏覽器、音樂播放器、通信錄等等。該層的程序是徹底平等的,開發人員可任意將自帶應用程序替換爲本身的應用程序。
2、Android運行機制
1. 啓動流程 全部從"init"開始... 與大多數的基於Linux系統在啓動階段相似,bootLoader加載"Linux內核",而後開始"init"進程。
(1)init啓動Linux守護進程,包括:
[1]USB守護進程(usbd):來管理USB鏈接Android調試橋守護進程;
[2]adbd:來管理ADB鏈接調試器守護進程;
[3]debuggerd:來管理調試進程請求(dump memory等等);
[4]射頻接口層守護進程(rild):來管理與射頻的通訊。
(2)Init進程啓動zygote進程: 一個新生的進程初始化一個Dalvik VM(虛擬機)實例加載類,並監聽socket端口用於請求建立VMs實例Forks請求建立VM實例用於管理進程寫時複製(Copy-on-write)來最大化重用和最小化覆蓋
(3)init進程啓動runtime進程: 初始化Service Manager——上下文管理器用於binder來處理service註冊和查詢註冊Service Manager做爲缺省的上下文管理用於Binder
(4)Runtime進程發送請求給Zygote來啓動System Service
(5)接着Zygote進程fork一個新的VM實例用於System Service進程,而後啓動該service。
(6)System Service啓動本地系統服務器,包括: Surface Flinger,Audio Flinger
(7)本地system servers註冊Servicee Manager做爲IPC service目標:
(8)System Service啓動Android管理服務:
(9)Android管理服務註冊到Service Manager中:
(10)到此,整個Android系統的啓動後:
(11)System Server加載完全部的services後, 系統準備...
2. 層間交互(Layer Interaction)
主要有以下三種類型的交互:
App -> Runtime Service -> lib;
App -> Runtime Service -> Native Service -> lib;
App -> Runtime Service -> Native Daemon -> lib 。
Android Runtime Services:
舉例:Location Manager
Android Native Services:
舉例:
Daemon Connection:
舉例:RILD