為何Android使用Binder機制來實現(xiàn)進程間的通信匿沛?扫责??
1.可靠性:在移動設(shè)備上逃呼,通常采用基于Client-Server的通信方式來實現(xiàn)互聯(lián)網(wǎng)與設(shè)備間的內(nèi)部通信鳖孤。目前l(fā)inux支持的IPC方式包括傳統(tǒng)的管道者娱、消息隊列、共享內(nèi)存苏揣、信號量黄鳍,以及socket,其中只有socket支持Client-Server的通信方式平匈。Android系統(tǒng)為開發(fā)者提供了豐富進程間通信的功能接口框沟,媒體播放,傳感器增炭,無線傳輸忍燥。這些功能都由不同的server來管理。開發(fā)都只關(guān)心將自己應(yīng)用程序的client與server的通信建立起來便可以使用這個服務(wù)弟跑。毫無疑問灾前,如若在底層架設(shè)一套協(xié)議來實現(xiàn)Client-Server通信,增加了系統(tǒng)的復(fù)雜性孟辑。在資源有限的手機 上來實現(xiàn)這種復(fù)雜的環(huán)境哎甲,可靠性難以保證。
2.傳輸性能:socket主要用于跨網(wǎng)絡(luò)的進程間通信和本機上進程間的通信饲嗽,但傳輸效率低炭玫,開銷大。消息隊列和管道采用存儲-轉(zhuǎn)發(fā)方式貌虾,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開辟的一塊緩存區(qū)中吞加,然后從內(nèi)核緩存區(qū)拷貝到接收方緩存區(qū),其過程至少有兩次拷貝尽狠。雖然共享內(nèi)存無需拷貝衔憨,但控制復(fù)雜。比較各種IPC方式的數(shù)據(jù)拷貝次數(shù)袄膏。共享內(nèi)存:0次践图。Binder:1次。Socket/管道/消息隊列:2次沉馆。
3.安全性:Android是一個開放式的平臺码党,所以確保應(yīng)用程序安全是很重要的。Android對每一個安裝應(yīng)用都分配了UID/PID,其中進程的UID是可用來鑒別進程身份斥黑。傳統(tǒng)的只能由用戶在數(shù)據(jù)包里填寫UID/PID揖盘,這樣不可靠,容易被惡意程序利用锌奴。而我們要求由內(nèi)核來添加可靠的UID兽狭。 所以,出于可靠性、傳輸性椭符、安全性荔燎。android建立了一套新的進程間通信方式耻姥。
另外:
對比Linux(Android基于Linux)上的其他進程通信方式(管道/消息隊列/共享內(nèi)存/信號量/Socket)销钝,Binder機制的優(yōu)點有:
高效
Binder數(shù)據(jù)拷貝只需要一次,而管道琐簇、消息隊列蒸健、Socket都需要2次
通過驅(qū)動在內(nèi)核空間拷貝數(shù)據(jù),不需要額外的同步處理
安全性高
Binder機制為每個進程分配了UID/PID來作為鑒別身份的標(biāo)示婉商,并且在Binder通信時會根據(jù)UID/PID進行有效性檢測
傳統(tǒng)的進程通信方式對于通信雙方的身份并沒有做出嚴(yán)格的驗證
如似忧,Socket通信ip地址是客戶端手動填入,容易出現(xiàn)偽造
使用簡單
采用Client/Server架構(gòu)
實現(xiàn)?面向?qū)ο?的調(diào)用方式丈秩,即在使用Binder時就和調(diào)用一個本地對象實例一樣
具體實現(xiàn)細節(jié):
Android中的Binder機制由一系列系統(tǒng)組件構(gòu)成:Client盯捌、Server、Service Manager和Binder驅(qū)動程序
首先Binder是Android系統(tǒng)進程間通信(IPC)方式之一蘑秽。
為什么Binder只進行了一次數(shù)據(jù)拷貝饺著?
Linux內(nèi)核實際上沒有從一個用戶空間到另一個用戶空間直接拷貝的函數(shù),需要先用copy_from_user()拷貝到內(nèi)核空間肠牲,再用copy_to_user()拷貝到另一個用戶空間幼衰。為了實現(xiàn)用戶空間到用戶空間的拷貝,mmap()分配的內(nèi)存除了映射進了接收方進程里缀雳,還映射進了內(nèi)核空間渡嚣。所以調(diào)用copy_from_user()將數(shù)據(jù)拷貝進內(nèi)核空間也相當(dāng)于拷貝進了接收方的用戶空間,這就是Binder只需一次拷貝的‘秘密’肥印。