我們知道,在Android系統(tǒng)中,每一個(gè)應(yīng)用程序都運(yùn)行在獨(dú)立的進(jìn)程中,這也保證了當(dāng)其中一個(gè)程序出現(xiàn)異常而不會(huì)影響另一個(gè)應(yīng)用程序的正常運(yùn)轉(zhuǎn)。在許多情況下,我們activity都會(huì)與各種系統(tǒng)的service打交道,很顯然,我們寫(xiě)的程序中activity與系統(tǒng)service肯定不是同一個(gè)進(jìn)程,但是它們之間是怎樣實(shí)現(xiàn)通信的呢?Binder是android中一種實(shí)現(xiàn)進(jìn)程間通信(IPC)的方式之一。
了解Binder
1.binder用來(lái)做什么?用來(lái)實(shí)現(xiàn)不同進(jìn)程之間的通信。
2.Binder是什么?binder屬于一個(gè)驅(qū)動(dòng),工作在linux層面,運(yùn)行在內(nèi)核態(tài),它的操作完成是基于一段內(nèi)存。所以我們開(kāi)發(fā)的程序中對(duì)binder的使用都是通過(guò)系統(tǒng)的調(diào)用來(lái)完成的。
3.binder是怎樣實(shí)現(xiàn)進(jìn)程通信的?我們來(lái)通過(guò)Binder的架構(gòu)來(lái)了解它實(shí)現(xiàn)進(jìn)程間通信(IPC)的過(guò)程。
Binder架構(gòu)由服務(wù)端,binder驅(qū)動(dòng),客戶(hù)端三個(gè)部分構(gòu)成。如圖所示。
?
?
Android中的Binder機(jī)制的簡(jiǎn)要理解
其中服務(wù)端,客戶(hù)端處在用戶(hù)空間,而binder驅(qū)動(dòng)處在內(nèi)核空間。
服務(wù)器端。一個(gè)Binder服務(wù)器端就是一個(gè)Binder類(lèi)的對(duì)象。當(dāng)創(chuàng)建一個(gè)Binder對(duì)象后,內(nèi)部就會(huì)開(kāi)啟一個(gè)線程,這個(gè)線程用于接收binder驅(qū)動(dòng)發(fā)送的信息,收到消息后,會(huì)執(zhí)行相關(guān)的服務(wù)代碼。、
Binder驅(qū)動(dòng)。當(dāng)服務(wù)端成功創(chuàng)建一個(gè)Binder對(duì)象后,Binder驅(qū)動(dòng)也會(huì)相應(yīng)創(chuàng)建一個(gè)mRemote對(duì)象,該對(duì)象的類(lèi)型也是Binder類(lèi)。客戶(hù)就可以借助這個(gè)mRemote對(duì)象來(lái)訪問(wèn)遠(yuǎn)程服務(wù)。
客戶(hù)端。客戶(hù)端要想訪問(wèn)Binder的遠(yuǎn)程服務(wù),就必須獲取遠(yuǎn)程服務(wù)的Binder對(duì)象在binder驅(qū)動(dòng)層對(duì)應(yīng)的mRemote引用。當(dāng)獲取到mRemote對(duì)象的引用后,就可以調(diào)用相應(yīng)Binder對(duì)象的服務(wù)了。
在這里,我們可以看到,客戶(hù)端是通過(guò)Binder驅(qū)動(dòng)來(lái)調(diào)用服務(wù)端的相關(guān)服務(wù)。首先,在服務(wù)端創(chuàng)建一個(gè)Binder對(duì)象,然后相應(yīng)在Binder驅(qū)動(dòng)中創(chuàng)建一個(gè)Binder對(duì)象,接著客戶(hù)端通過(guò)獲取Binder驅(qū)動(dòng)中Binder對(duì)象的引用來(lái)調(diào)用服務(wù)端的服務(wù)。在Binder機(jī)制中正是借著B(niǎo)inder驅(qū)動(dòng)將不同進(jìn)程間的組件bind(粘連)在一起,實(shí)現(xiàn)通信。
為什么android選用Binder來(lái)實(shí)現(xiàn)進(jìn)程間通信?
一、可靠性。在移動(dòng)設(shè)備上,通常采用基于Client-Server的通信方式來(lái)實(shí)現(xiàn)互聯(lián)網(wǎng)與設(shè)備間的內(nèi)部通信。目前l(fā)inux支持IPC包括傳統(tǒng)的管道,System V IPC,即消息隊(duì)列/共享內(nèi)存/信號(hào)量,以及socket中只有socket支持Client-Server的通信方式。Android系統(tǒng)為開(kāi)發(fā)者提供了豐富進(jìn)程間通信的功能接口,媒體播放,傳感器,無(wú)線傳輸。這些功能都由不同的server來(lái)管理。開(kāi)發(fā)都只關(guān)心將自己應(yīng)用程序的client與server的通信建立起來(lái)便可以使用這個(gè)服務(wù)。毫無(wú)疑問(wèn),如若在底層架設(shè)一套協(xié)議來(lái)實(shí)現(xiàn)Client-Server通信,增加了系統(tǒng)的復(fù)雜性。在資源有限的手機(jī) 上來(lái)實(shí)現(xiàn)這種復(fù)雜的環(huán)境,可靠性難以保證。
二、傳輸性能。socket主要用于跨網(wǎng)絡(luò)的進(jìn)程間通信和本機(jī)上進(jìn)程間的通信,但傳輸效率低,開(kāi)銷(xiāo)大。消息隊(duì)列和管道采用存儲(chǔ)-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開(kāi)辟的一塊緩存區(qū)中,然后從內(nèi)核緩存區(qū)拷貝到接收方緩存區(qū),其過(guò)程至少有兩次拷貝。雖然共享內(nèi)存無(wú)需拷貝,但控制復(fù)雜。比較各種IPC方式的數(shù)據(jù)拷貝次數(shù)。共享內(nèi)存:0次。Binder:1次。Socket/管道/消息隊(duì)列:2次。
三、安全性。Android是一個(gè)開(kāi)放式的平臺(tái),所以確保應(yīng)用程序安全是很重要的。Android對(duì)每一個(gè)安裝應(yīng)用都分配了UID/PID,其中進(jìn)程的UID是可用來(lái)鑒別進(jìn)程身份。傳統(tǒng)的只能由用戶(hù)在數(shù)據(jù)包里填寫(xiě)UID/PID,這樣不可靠,容易被惡意程序利用。而我們要求由內(nèi)核來(lái)添加可靠的UID。
所以,出于可靠性、傳輸性、安全性。android建立了一套新的進(jìn)程間通信方式。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
