Android Binder機製淺
摘要
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. https://www.cnblogs.com/innost/archive/2011/01/09/1931456.html
2. https://disanji.net/2011/02/28/android-bnder-design/
最後更新:2017-04-03 12:55:35