寫在最前端
在Android系統(tǒng)中,每一個(gè)app都是運(yùn)行在一個(gè)獨(dú)立的進(jìn)程中的,不同進(jìn)程之間是相互隔離、相互獨(dú)立的,Android系統(tǒng)如此設(shè)計(jì)的目的是保障app的安全性和獨(dú)立性。試想如果你開發(fā)的app程序在運(yùn)行的過(guò)程中,可以被其他任意app調(diào)用和訪問(wèn),這是多么可怕的事情。但是時(shí)代發(fā)展的規(guī)律告訴我們,有交流才會(huì)有進(jìn)步,相互合作才會(huì)共贏。Android也順應(yīng)這種時(shí)代發(fā)展規(guī)律,所以為用戶提供了一套進(jìn)程間通信的機(jī)制(IPC)——Binder機(jī)制。
Binder機(jī)制本身比較強(qiáng)大,其中的Binder驅(qū)動(dòng)等都是在Linux內(nèi)核中,如果通過(guò)分析源碼的方式,很多不熟悉C/C++的人可能會(huì)感到非常困難,本次只宏觀分析,宗旨是讓大家對(duì)Binder機(jī)制有一個(gè)宏觀上的理解,重點(diǎn)是理解和吸收這種設(shè)計(jì)的思想。
注意:本文中沒(méi)有結(jié)合源碼進(jìn)行分析,有需要看源碼的請(qǐng)繞過(guò)~~
轉(zhuǎn)發(fā)請(qǐng)標(biāo)明出處:https://blog.csdn.net/Dream_201603/article/details/85260739
Binder通信機(jī)制原理
1 進(jìn)程通信途徑
首先要知道,進(jìn)程空間分兩部分,一部分運(yùn)行在Linux的內(nèi)核空間,另一部分運(yùn)行在用戶空間。Android系統(tǒng)中所有進(jìn)程共用一個(gè)內(nèi)核空間,不同進(jìn)程的內(nèi)核空間可以共享數(shù)據(jù),但是不同進(jìn)程的用戶空間不可以共享數(shù)據(jù)。進(jìn)程內(nèi),用戶空間可以通過(guò)“系統(tǒng)調(diào)用”來(lái)訪問(wèn)內(nèi)核空間。內(nèi)核空間內(nèi),可以通過(guò)Binde驅(qū)動(dòng)進(jìn)行數(shù)據(jù)的傳輸。所以進(jìn)程之間要進(jìn)行通信,必須通過(guò)如下圖所示的模擬途徑:
2 Binder通信機(jī)制(Client-Server模型)
現(xiàn)在對(duì)跨進(jìn)程間通信的路徑有了一個(gè)宏觀上的認(rèn)知,下面將介紹Binder通信機(jī)制中的Client-Server模型。當(dāng)前模擬一下兩個(gè)進(jìn)程之間的通信:假設(shè)其中一個(gè)進(jìn)程提供一種加密數(shù)據(jù)的服務(wù),另一個(gè)進(jìn)程想要通過(guò)該服務(wù)將自己的數(shù)據(jù)進(jìn)行加密。現(xiàn)在我們稱提供加密服務(wù)的進(jìn)程為Server進(jìn)程(服務(wù)端),要使用服務(wù)的進(jìn)程稱為Client進(jìn)程(客戶端)。
- Server進(jìn)程:提供服務(wù)的進(jìn)程,類似于服務(wù)器
- Client進(jìn)程:要使用服務(wù)的進(jìn)程,類似于客戶端
在Android中,進(jìn)程在用戶空間是不能進(jìn)行消息傳輸?shù)?,在?nèi)核空間中是通過(guò)Binder驅(qū)動(dòng)進(jìn)行傳遞消息的,任意一個(gè)進(jìn)程都可以提供服務(wù)的,提供服務(wù)的進(jìn)程只需要將自己的信息告知Binder驅(qū)動(dòng),Binder驅(qū)動(dòng)就會(huì)將提供服務(wù)的進(jìn)程信息保存在ServerManager進(jìn)程中,ServerManager進(jìn)程是用來(lái)管理Server進(jìn)程的注冊(cè)與查詢的。當(dāng)有Client進(jìn)程要使用這個(gè)Server進(jìn)程的服務(wù)時(shí),Client進(jìn)程首先向Binder驅(qū)動(dòng)提出要使用這個(gè)Server進(jìn)程,Binder驅(qū)動(dòng)會(huì)通過(guò)ServerManager進(jìn)程獲取該Server進(jìn)程的信息并返回該Clinet進(jìn)程,Client進(jìn)程通過(guò)這些信息與Server進(jìn)程進(jìn)行連接,之后通過(guò)Binder驅(qū)動(dòng)就可以進(jìn)行消息的傳輸了。
- ServerManager進(jìn)程:用來(lái)管理Server進(jìn)程的注冊(cè)與查詢,類似于路由器
- Binder驅(qū)動(dòng):連接Server進(jìn)程、Client進(jìn)程和ServerManager進(jìn)程的橋梁,類似于網(wǎng)線
上述步驟的模擬圖如下:
進(jìn)程通信的整體使用步驟說(shuō)明:
- (1)注冊(cè)服務(wù)
- ①Server進(jìn)程向Binder驅(qū)動(dòng)發(fā)起注冊(cè)服務(wù)的請(qǐng)求。
- ②Binder驅(qū)動(dòng)將注冊(cè)請(qǐng)求傳遞給ServerManager進(jìn)程。
- ServerManager進(jìn)程記錄該服務(wù)的信息。
至此,服務(wù)注冊(cè)成功。
- (2) 建立連接
- ③Client進(jìn)程向Binder驅(qū)動(dòng)發(fā)起獲取指定服務(wù)的請(qǐng)求,并攜帶要獲取的服務(wù)名稱
- ④Binder驅(qū)動(dòng)將請(qǐng)求傳遞給ServerManager進(jìn)程
- ServerManager進(jìn)程根據(jù)服務(wù)名稱查找Client進(jìn)程需要的Server進(jìn)程對(duì)應(yīng)的信息
- ⑤ServerManager進(jìn)程將對(duì)應(yīng)的信息傳發(fā)送給Binder驅(qū)動(dòng)
- ⑥Binder驅(qū)動(dòng)將對(duì)應(yīng)的信息傳遞給Clinet進(jìn)程
至此,Client進(jìn)程與Server進(jìn)程之間建立連接。
- (3) 使用服務(wù)
- ⑦Client進(jìn)程發(fā)送要處理的數(shù)據(jù)
- Binder驅(qū)動(dòng)將Client進(jìn)程發(fā)送的數(shù)據(jù)傳遞給Server進(jìn)程
- ⑧Server進(jìn)程獲取到Client進(jìn)程發(fā)送過(guò)來(lái)的數(shù)據(jù)
至此,數(shù)據(jù)傳輸完成。
3 Client-Server模型中數(shù)據(jù)傳遞的詳細(xì)介紹
如上圖所示,詳細(xì)介紹了當(dāng)Client進(jìn)程與Server進(jìn)程之間建立好連接后,通過(guò)Binder驅(qū)動(dòng)為媒介進(jìn)行數(shù)據(jù)傳輸?shù)脑敿?xì)過(guò)程。整體分為三個(gè)步驟:
- (1)Client進(jìn)程發(fā)送數(shù)據(jù):①②③④⑤
- (2)執(zhí)行對(duì)應(yīng)的服務(wù)功能:⑥
- (3)Server進(jìn)程返回執(zhí)行的結(jié)果:⑦⑧⑨⑩
因?yàn)樯蠄D已經(jīng)將步驟的具體操作說(shuō)明寫上了,標(biāo)注的都非常詳細(xì),此處就不再展開詳細(xì)復(fù)述。
4 Android開發(fā)者在開發(fā)中需要實(shí)現(xiàn)的點(diǎn)
上面已將全面的介紹了Android進(jìn)程間通信的Binder機(jī)制:Client-Server模型。模型設(shè)計(jì)中的好多思想是值得我們學(xué)習(xí)和深思的,但是Binder機(jī)制涉及的知識(shí)這么多,好多人似乎都被它嚇到了。其實(shí)不然,既然作為Android中進(jìn)程間通信的方式,這些其實(shí)都是Android為我們實(shí)現(xiàn)好的,在開發(fā)中我們只需要知道如何使用就行了。下面我們就了解一下哪些是Android已經(jīng)幫我們實(shí)現(xiàn)好的,哪些是需要我們開發(fā)者實(shí)現(xiàn)的。
其實(shí)在Android系統(tǒng)中,Binder驅(qū)動(dòng)和ServerManager進(jìn)程都是Android已經(jīng)幫我們實(shí)現(xiàn)好了的,Client進(jìn)程和Server進(jìn)程是我們需要自己實(shí)現(xiàn)的。這也好理解,就在贅述了。如下圖所示:
綜上:
- Binder驅(qū)動(dòng)和ServerManager進(jìn)程是Android系統(tǒng)已經(jīng)實(shí)現(xiàn)好的
- Client進(jìn)程和Server進(jìn)程是需要開發(fā)者自己實(shí)現(xiàn)的
5 補(bǔ)充說(shuō)明的點(diǎn):Binder請(qǐng)求的線程管理
以上就將Binder機(jī)制基本介紹完全,有些細(xì)節(jié)上的點(diǎn)需要補(bǔ)充一下,主要補(bǔ)充的是Binder請(qǐng)求時(shí)的線程管理。為什么要引入線程管理,其實(shí)很好理解,因?yàn)镾erver進(jìn)程是給Client進(jìn)程提供服務(wù)的,也就是說(shuō)Server進(jìn)程只提供服務(wù),而Client進(jìn)程只是使用。那就會(huì)出現(xiàn)多個(gè)Client進(jìn)程使用同一個(gè)Server進(jìn)程,為了并發(fā)操作,所以Server進(jìn)程會(huì)創(chuàng)建額很多線程來(lái)處理Binder請(qǐng)求。多線程操作自然就引出了線程池的概念,而在Binder機(jī)制中,管理Binder模型的線程是采用的Binder驅(qū)動(dòng)的線程池,并由Binder驅(qū)動(dòng)管理該線程池。一個(gè)進(jìn)程的Binder線程數(shù)默認(rèn)最大是16,超過(guò)之后不會(huì)再創(chuàng)建新的線程,而是會(huì)阻塞等待空閑的Binder線程。
總結(jié)
Android中通過(guò)Binder機(jī)制進(jìn)行進(jìn)程間通信是非常普遍的,常用的有:內(nèi)容提供者、AIDL等。到此,基本將Android進(jìn)程間通信的Binder機(jī)制講述完成,有想更深入了解的可以通過(guò)Android源碼來(lái)詳細(xì)品味。編寫倉(cāng)促,有問(wèn)題點(diǎn)歡迎指正。
-----------------分----------------割---------------線-------------------