Binder是android中一個很重要且很複雜的概念,它在系統的總體運做中發揮着極其重要的做用,不過本文並不打算從深層次分析Binder機制,有兩點緣由:1是目前網上已經有2篇很好的文章了,2是對Binder機制進行深刻底層乃至驅動的分析這一過程至關困難且至關耗時,所以並不適合重複造輪子。本文的角度是對Android的Binder機制從總體和概念上進行分析,可以讓你們很快明白到底什麼是Binder,Binder是幹什麼的,Binder和應用開發的關係是什麼,總之,這篇文章仍是很值得去看一看的。html
1. 直觀來講,Binder是Android中的一個類,它繼承了IBinder接口linux
2. 從IPC角度來講,Binder是Android中的一種跨進程通訊方式,Binder還能夠理解爲一種虛擬的物理設備,它的設備驅動是/dev/binder,該通訊方式在linux中沒有android
3. 從Android Framework角度來講,Binder是ServiceManager鏈接各類Manager(ActivityManager、WindowManager,etc)和相應ManagerService的橋樑緩存
4. 從Android應用層來講,Binder是客戶端和服務端進行通訊的媒介,當你bindService的時候,服務端會返回一個包含了服務端業務調用的Binder對象,經過這個Binder對象,客戶端就能夠獲取服務端提供的服務或者數據,這裏的服務包括普通服務和基於AIDL的服務安全
Android中有大量的CS(Client-Server)應用方式,這就要求Android內部提供IPC方法,而linux所支持的進程通訊方式有兩個問題:性能和安全性。網絡
目前linux支持的IPC包括傳統的管道,System V IPC(消息隊列/共享內存/信號量),以及socket,但只有socket支持Client-Server的通訊方式,因爲socket是一套通用的網絡通訊方式,其傳輸效率低下切有很大的開銷,好比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通訊過程示例:spa
參考:.net
1. http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html