1. 程式人生 > >Binder 理論部分筆記整理

Binder 理論部分筆記整理

主要參考文章:

1. Binder 是什麼?

Binder 是 Android 系統獨有的程序間通訊(IPC)方式之一。不同於 Linux 原有的 IPC 實現方式(Pipe、Signal、Socket、Share Memory)。

2. 優勢

(1)效能:使用記憶體對映機制實現資料的傳輸只 copy 一次。

	程序空間是 Linux 基礎知識,每一個程序的記憶體空間分為 User Space 和 Kernel Space,
	User Space 存放應用程式的程式碼和資料,是程序隔離的,但是 Kernel Space 存放核心程式碼和
	資料,是核心和所有程序共享的——這才是能真正做到 IPC 互動的根本原因

	正常情況下通過系統呼叫 copyFromUser 將 Server 的資料從 Server 程序的 User Space copy 
	到 Kernel Space, 處理後再由 Kernel Space copyToUser 到 Client 程序的 User Space,
	從而進行 IPC 資料互動。

	IPC 的本質是程序 User Space 和 Kernel Space 的資料互動或轉換。

(2)安全:在核心空間新增身份標識(傳統IPC沒有,依賴上層協議控制),從而提供 API 可以區分 Caller uid, pid 進行包名、簽名校驗等;(校驗方法除包名、簽名外還可以加簡單的 custom permission)

(3)易用:是封裝的很好的 C/S 架構,是面向物件的思維和呼叫方式。AIDL 自動生成,遮蔽細節,整個 AIDL 目錄放到 Client 下,然後再有 Proxy,相當於直接有一個 Server 的引用 Object,十分易於理解和方便呼叫,Client 呼叫 Proxy, Server 呼叫 Stub。比 Socket/Signal/Share Memory都簡單。

2. 應用場景

  • Framework 中各種 Service 的互動,如 AMS/PMS 等;
  • 應用開發層之間的程序互動。

3. 工作過程及原理

該框架定義了四個角色:Server,Client,ServiceManager(以後簡稱 SMgr)以及 Binder 驅動。其中 Server,Client,SMgr 運行於使用者空間,驅動運行於核心空間。

Binder 驅動:Binder 驅動是一個名詞,和傳統的 “驅動” 不同,與實際硬體裝置無關,只不過其實現方式類似於驅動。本質上是基於 C++ 實現的程式碼,即 Linux 底層驅動,是 Server/Client/ServiceManager 通訊的橋樑,通過記憶體對映機制在核心實現 IPC,持有 Server 在 Kernel Space 的 Binder 實體,負責程序之間 Binder 通訊的建立,Binder 在程序之間的傳遞(給 Client 提供 Binder 實體的引用,即我們說的 Remote Object),Binder 引用計數管理,資料包在程序之間的傳遞和互動等一系列底層支援。且驅動和應用程式之間定義了一套介面協議。

ServiceManager:將字元形式的 Binder 名字轉化成 Client 中對該 Binder 的引用,使得 Client 能夠通過 Binder 名字獲得對 Server 中 Binder 實體的引用,是 Binder Driver 和 Server/Client 之間的上下文管理者,負責 Service 的註冊、查詢。

在這裡插入圖片描述

在這裡插入圖片描述

一個 Binder 實體可以傳送給其它程序從而建立許多跨程序的引用;另外這些引用也可以在程序之間傳遞,就象 java 裡將一個引用賦給另一個引用一樣。為 Binder 在不同程序中建立引用必須有驅動的參與,由驅動在核心建立並註冊相關的資料結構(該資料結構即為核心中的 Binder 實體)後接收方才能使用該引用。

簡單的說,Binder 跨程序傳輸並不是真的把一個物件傳輸到了另外一個程序,只不過是 Client 端通過 SMgr 獲得在 Server 中目標 Binder 的“引用”—— Binder 的代理物件(這是一個新的物件),然後進行操作(即呼叫代理物件的方法),然後這一“操作”會通過以 指令+資料 的形式通過驅動傳遞給 Server 端真正的 Binder 實體,使 Binder 解析並實現這一“操作”,對應的從真正意義上呼叫目標方法,之後將結果再利用驅動再返回給 Client 端。

4. Binder 在系統各部分中的表述

即 BInder 在 Client、Server、驅動以及資料傳輸時的存在形式。 請參考 Android Bander設計與實現 - 設計篇 第 5 點。