Android Binder機制淺析

yangxi_001發表於2016-12-28

摘要

Binder是Android中一個很重要且很複雜的概念,它在系統的整體運作中發揮著極其重要的作用,不過本文並不打算從深層次分析Binder機制,有兩點原因:1是目前網上已經有2篇很好的文章了,2是對Binder機制進行深入底層乃至驅動的分析這一過程相當困難且相當耗時,因此並不適合重複造輪子。本文的角度是對Android的Binder機制從整體和概念上進行分析,能夠讓大家很快明白到底什麼是Binder,Binder是幹什麼的,Binder和應用開發的關係是什麼,總之,這篇文章還是很值得去看一看的。

什麼是Binder

1. 直觀來說,Binder是Android中的一個類,它繼承了IBinder介面

2. 從IPC角度來說,Binder是Android中的一種跨程式通訊方式,Binder還可以理解為一種虛擬的物理裝置,它的裝置驅動是/dev/binder,該通訊方式在Linux中沒有

3. 從Android Framework角度來說,Binder是ServiceManager連線各種Manager(ActivityManager、WindowManager,etc)和相應ManagerService的橋樑

4. 從Android應用層來說,Binder是客戶端和服務端進行通訊的媒介,當你bindService的時候,服務端會返回一個包含了服務端業務呼叫的Binder物件,通過這個Binder物件,客戶端就可以獲取服務端提供的服務或者資料,這裡的服務包括普通服務和基於AIDL的服務

為什麼Android核心要使用Binder

Android中有大量的CS(Client-Server)應用方式,這就要求Android內部提供IPC方法,而linux所支援的程式通訊方式有兩個問題:效能和安全性。

目前linux支援的IPC包括傳統的管道,System V IPC(訊息佇列/共享記憶體/訊號量),以及socket,但只有socket支援Client-Server的通訊方式,由於socket是一套通用的網路通訊方式,其傳輸效率低下切有很大的開銷,比如socket的連線建立過程和中斷連線過程都是有一定開銷的。訊息佇列和管道採用儲存-轉發方式,即資料先從傳送方快取區拷貝到核心開闢的快取區中,然後再從核心快取區拷貝到接收方快取區,至少有兩次拷貝過程。共享記憶體雖然無需拷貝,但控制複雜,難以使用。

在安全性方面,Android作為一個開放式,擁有眾多開發者的的平臺,應用程式的來源廣泛,確保智慧終端的安全是非常重要的。終端使用者不希望從網上下載的程式在不知情的情況下偷窺隱私資料,連線無線網路,長期操作底層裝置導致電池很快耗盡等等。傳統IPC沒有任何安全措施,完全依賴上層協議來確保。首先傳統IPC的接收方無法獲得對方程式可靠的UID/PID(使用者ID/程式ID),從而無法鑑別對方身份。Android為每個安裝好的應用程式分配了自己的UID,故程式的UID是鑑別程式身份的重要標誌。使用傳統IPC只能由使用者在資料包裡填入UID/PID,但這樣不可靠,容易被惡意程式利用。可靠的身份標記只有由IPC機制本身在核心中新增。其次傳統IPC訪問接入點是開放的,無法建立私有通道。比如命名管道的名稱,system V的鍵值,socket的ip地址或檔名都是開放的,只要知道這些接入點的程式都可以和對端建立連線,不管怎樣都無法阻止惡意程式通過猜測接收方地址獲得連線。

基於以上原因,Android需要建立一套新的IPC機制來滿足系統對通訊方式,傳輸效能和安全性的要求,這就是Binder。Binder基於 Client-Server通訊模式,傳輸過程只需一次拷貝,為傳送發新增UID/PID身份,既支援實名Binder也支援匿名Binder,安全性高。下圖為Binder通訊過程示例:

參考:

1. http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html

2. http://blog.csdn.net/universus/article/details/6211589

相關文章