Android運行機制

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時按需動態加載

dlHandle = dlopen(「/system/lib/libacme.so」, RTLD_NOW);
...
acmeInit = (const AcmeFunctions *(*)(const struct Env *, 
int, char **))dlsym(dlHandle, 」Acme_Init);
...
acmeFuncs = acmeInit(&env, argc, argv);

3.Android Runtime(Android運行時)

(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);

主要硬件服務: Telephony Service,Location Service,Bluetooth Service,WIFI Service,USB Service,Sensor Service
更多的關於應用框架的信息參考: Google I/O :「Inside the Androoid Application Framework」Online :http://code.google.com/android

五、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

\

相關文章
相關標籤/搜索