Binder 總覽

繫結器是處理序間通訊系統,可讓 Android 裝置上的兩個處理序通訊。Binder 提供在另一個程序中執行函式呼叫的方法,對呼叫端完全透明。

以繫結器來說,呼叫程序會視為「用戶端」,其端點則稱為「繫結器 Proxy」或「Proxy」。反之,被呼叫的程序是「伺服器」,其端點則稱為「繫結器節點」或「節點」。

每個節點都可以公開及實作自己的介面。此外,使用 Proxy 時,用戶端可以在節點介面上執行方法,就像叫用的是本機函式呼叫一樣。以下範例顯示方法的叫用方式:

int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object

假設呼叫 foo() 的用戶端在程序 A 中執行,而實作 foo() 的伺服器在程序 B 中執行。圖 1 顯示如何執行這項呼叫:

執行 Binder 呼叫。

圖 1. 執行 Binder 呼叫。

如要執行另一個程序中的方法 (如圖 1 所示),請按照下列步驟操作:

  1. 程序 A 中的用戶端程式碼會叫用程序 A 中的 Proxy 程式碼。程序 A 中的 Proxy 程式碼會建立交易,其中包含下列項目:
    • 節點的 ID
    • 節點上 foo() 方法的 ID
    • 緩衝區,內含引數 ab 的副本
  2. 交易會提交至繫結器核心驅動程式。
  3. 繫結器核心驅動程式會判斷程序 B 是節點的主機。
  4. 核心會將整個交易複製到程序 B 的位址空間。
  5. 核心會在程序 B 中找到處理交易的執行緒,並將交易傳遞給該執行緒。
  6. 執行緒會解壓縮交易、找出節點,然後將交易傳送至節點物件。
  7. 節點物件會從交易取得函式 ID,從交易緩衝區解壓縮 ab,並將 ab 儲存在本機變數中。
  8. 節點物件會在程序 B 中呼叫伺服器程式碼的 foo(a, b)
  9. 呼叫結果會以回覆交易的形式傳回,並傳遞至核心驅動程式,然後傳回程序 A 中的呼叫 Proxy。
  10. Proxy 會將結果傳回程序 A 中的呼叫端。

Binder 用途

在各種情況下,您都可以使用 Binder,在不同程序中的軟體之間進行通訊。例如:

  • 相機應用程式會使用繫結器,與另一個程序中的相機伺服器通訊。接著,相機伺服器會使用繫結器與另一個程序中的相機 HAL 通訊。

  • 應用程式會使用繫結器與其他程序中的系統伺服器通訊。系統伺服器會使用繫結與其他程序中的 HAL 通訊。

  • 某個程序中的應用程式會使用繫結器,與另一個程序中的應用程式通訊。

  • 負責安裝、更新及移除應用程式的系統精靈 (installd) 會使用繫結器與 Android 執行階段精靈 (「artd」) 通訊,以編譯應用程式。