天天看點

Android程序間通信機制Binder學習

Android 系統是基于 Linux 核心的,Linux 已經提供了管道、消息隊列、共享記憶體和 Socket 等 IPC (跨進城通信)機制。但是由于性能、穩定性和安全性幾方面的原因,Android系統設計了Binder機制來實作IPC.

  • 性能
    Android程式間通信機制Binder學習
  • 穩定

    Binder 基于 C/S 架構,用戶端(Client)有什麼需求就丢給服務端(Server)去完成,架構清晰、職責明确又互相獨立,自然穩定性更好。共享記憶體雖然無需拷貝,但是控制負責,難以使用。從穩定性的角度講,Binder 機制是優于記憶體共享的。

  • 安全

    另一方面就是安全性。Android 作為一個開放性的平台,市場上有各類海量的應用供使用者選擇安裝,是以安全性對于 Android 平台而言極其重要。作為使用者當然不希望我們下載下傳的 APP 偷偷讀取我的通信錄,上傳我的隐私資料,背景偷跑流量、消耗手機電量。傳統的 IPC 沒有任何安全措施,完全依賴上層協定來確定。首先傳統的 IPC 接收方無法獲得對方可靠的程序使用者ID/程序ID(UID/PID),進而無法鑒别對方身份。Android 為每個安裝好的 APP 配置設定了自己的 UID,故而程序的 UID 是鑒别程序身份的重要标志。傳統的 IPC 隻能由使用者在資料包中填入 UID/PID,但這樣不可靠,容易被惡意程式利用。可靠的身份辨別隻有由 IPC 機制在核心中添加。其次傳統的 IPC 通路接入點是開放的,隻要知道這些接入點的程式都可以和對端建立連接配接,不管怎樣都無法阻止惡意程式通過猜測接收方位址獲得連接配接。同時 Binder 既支援實名 Binder,又支援匿名 Binder,安全性高。

是以Binder優點很突出:

Android程式間通信機制Binder學習

Binder通信流程概覽:

Android程式間通信機制Binder學習

首先,一個程序使用 BINDERSETCONTEXT_MGR 指令通過 Binder 驅動将自己注冊成為 ServiceManager;

Server 通過驅動向 ServiceManager 中注冊 Binder(Server 中的 Binder 實體),表明可以對外提供服務。驅動為這個 Binder 建立位于核心中的實體節點以及 ServiceManager 對實體的引用,将名字以及建立的引用打包傳給 ServiceManager,ServiceManger 将其填入查找表。

Client 通過名字,在 Binder 驅動的幫助下從 ServiceManager 中擷取到對 Binder 實體的引用,通過這個引用就能實作和 Server 程序的通信。