在 Android 框架裡,一個應用套件 (Application Package) 通常含有多個 Java 類別 (Class) ,這些類可以在同一個進程 (Process) 裡執行;也可以在不同的進程裡執行。基於 Linux 的安全限制,以及進程的基本特性 ( 例如,不同進程的位址空間是獨立的 ) ,如果兩個類別 ( 或其物件 ) 在同一個進程裏執行時,兩者溝通方便也快速。但是,當它們分別在不同的進程裡執行時,兩者溝通就屬於 IPC 跨進程溝通了,不如前者方便,也慢些。
一個進程是一個獨立的執行空間,不會被正在其他進程裡的程序所侵犯。這種保護方法是 Android 的重要安全機制。於是,得先認識進程的內涵,才能進一步了解跨進程 IPC(Inter-Process Communication) 機制。
在 Android 的進程裡,有一個虛擬機 (Virtual Machine ,簡稱 VM) 的物件(對象),可執行 Java程式 碼,也引導 JNI 本地程式的執行,實現 Java 與 C/C++ 程式之間的溝通;如下圖:
圖 1 Android 進程裡的基本元素
每一個進程在誕生時,都會誕生一個主線程 (Main Thread) ,以及誕生一個 Looper 類別的物件和一個 MQ(Message Queue) 資料結構。每當主線程作完事情,就會去執行 Looper 類別。此時,不斷地觀察 MQ 的動態。如下圖:
圖 2 Android 內部含有多個進程
主線程最主要的工作就是處理 UI 畫面的事件 (Event) ,每當 UI 事件發生時, Android 框架會丟信息 (Message) 到 MQ 裡。主線程看到 MQ 有新的訊息時,就取出訊息,然後依據訊息內容而去執行特定的函數。執行完畢,就再繼續執行 Looper 類別,不斷地觀察 MQ 的動態。
大家都知道,當兩個類別都在同一個進程裡執行時,兩者之間的溝通,只要採取一般的函數呼叫 (Function Call) 就行了,既快速又方便。一旦兩個類分別在不同的進程裡執行時,兩者之間的溝通,就不能採取一般的函數呼叫途徑了。只好採取 IPC 溝通途徑,如下圖:
圖 3 Android 框架的 IPC 機制之例
Android 框架的 IPC 溝通仰賴單一的 IBinder介面( 接口)。此時 Client 端呼叫 IBinder介面 的 transact() 函數,透過 IPC 機制而呼叫到遠方 (Remote) 的 onTransact() 函數。例如下圖裡的 myActivity1 、 myActivity2 和 myService 分別在不同的進程裡執行,透過 C++ 層的 IBinder介面 來進行跨進程的 IPC 溝通。
圖 4 Android IPC 機制的 IBinder介面
在此圖的不同進程裡,各有其主線程 (Thread) ,這些線程可並行 (Concurrent) 執行,形成多線程 (Multiple-Thread) 的執行環境。例如上圖 4-14 , myActivity1 和 myActivity2 並行執行,並透過 C++ 層的 JavaBBinder 類別而共享 ( 可能並行 ) 了 Java 層的 myService 類別之服務。
转自: http://www.android1.net/Topic.aspx?BoardID=21&TopicID=1416
作者:高煥堂