Binder(膠水喷鸽,粘合劑 ) 是Android系統(tǒng)最重要的特性之一凤价。是系統(tǒng)間各個(gè)組建的橋梁。Android系統(tǒng)的開放式很大程度上得益于這種極其方便的跨進(jìn)程通信機(jī)制
理解Binder對(duì)于理解整個(gè)Android系統(tǒng)有著重要的作用嗡害,Android系統(tǒng)的四大組件谆甜,AMS,PMS等系統(tǒng)服務(wù)無一不與Binder掛鉤届吁〈硌可以說無Binder不Android
Binder分為 Binder對(duì)象 和 Binder驅(qū)動(dòng)。
Binder 驅(qū)動(dòng)
在Android系統(tǒng)中疚沐,這個(gè)運(yùn)行在內(nèi)核空間的暂氯,負(fù)責(zé)各個(gè)用戶進(jìn)程通過Binder通信的內(nèi)核模塊叫做Binder驅(qū)動(dòng)。但是Binder并不是Linux內(nèi)核的一部分亮蛔,它可以訪問內(nèi)核空間是因?yàn)長(zhǎng)inux的動(dòng)態(tài)可加載內(nèi)核模塊(Loadable Kernel Module痴施,LKM)機(jī)制。模塊是具有獨(dú)立功能的程序究流,它可以被單獨(dú)編譯辣吃,但不能獨(dú)立運(yùn)行。它在運(yùn)行時(shí)被鏈接到內(nèi)核作為內(nèi)核的一部分在內(nèi)核空間運(yùn)行芬探。
Binder 對(duì)象
Binder對(duì)象是一個(gè)可以夸進(jìn)程引用的對(duì)象齿尽,它的實(shí)現(xiàn)位于一個(gè)進(jìn)程中,而它的引用卻遍布與系統(tǒng)的各個(gè)進(jìn)程之中灯节。最誘人的是,這個(gè)引用和java引用一樣,既可以是強(qiáng)類型炎疆,也可以是弱類型卡骂,而且可以從一個(gè)進(jìn)程傳遞給其他進(jìn)程,讓大家都能訪問同一個(gè)Server形入,就像將一個(gè)對(duì)象或引用賦值給另一個(gè)引用一樣全跨。分為本地對(duì)象和代理對(duì)象
- Binder 本地對(duì)像:AIDL接口實(shí)現(xiàn)端的對(duì)象
- Binder 代理對(duì)象: 它只是Binder本地對(duì)象的一個(gè)遠(yuǎn)程代理;對(duì)這個(gè)Binder代理對(duì)象的操作亿遂,會(huì)通過Binder驅(qū)動(dòng)最終轉(zhuǎn)發(fā)到Binder本地對(duì)象上去完成
Binder驅(qū)動(dòng)是主要的內(nèi)核模塊浓若,而整個(gè)Binder對(duì)象就是通訊載體∩呤可以自由的通過Binder驅(qū)動(dòng)穿梭任意進(jìn)程挪钓。所以客戶端或者服務(wù)器可以把數(shù)據(jù)放入Binder對(duì)象里,然后進(jìn)行調(diào)用和通訊耳舅。
Binder 從不同的角度碌上,可以有不同的解釋:
- 是Android的一個(gè)類,即Binder.java浦徊,實(shí)現(xiàn)了IBinder接口馏予,
- 從IPC角度說,是Android的一種跨進(jìn)程通信方式盔性,這種方式在Linux中沒有
- 還可以理解為一種虛擬的物理設(shè)備霞丧,Binder驅(qū)動(dòng),設(shè)備驅(qū)動(dòng)在/dev/binder,
- 從Android Framework角度來說冕香,是ServiceManager連接各種Manager(ActivityManager蛹尝,WindowManager等)和形影的ManagerService的橋梁
- 從Android應(yīng)用層來說,是客戶端和服務(wù)端進(jìn)行通信的媒介暂筝,當(dāng)bindService的時(shí)候箩言,服務(wù)端會(huì)返回一個(gè)包含了服務(wù)端業(yè)務(wù)調(diào)用的Binder對(duì)象,通過這個(gè)Binder對(duì)象焕襟,客戶端就可以獲取服務(wù)器提供的服務(wù)或者數(shù)據(jù)了陨收,這里的服務(wù)包括普通的服務(wù)和基于AIDL的服務(wù)
- 對(duì)于Server進(jìn)程來說,Binder指的是Binder本地對(duì)象鸵赖。
- 對(duì)于Client來說务漩,Binder指的是Binder代理對(duì)象,對(duì)于一個(gè)擁有Binder對(duì)象的使用者而言它褪,它無須關(guān)心這是一個(gè)Binder代理對(duì)象還是Binder本地對(duì)象饵骨;對(duì)于代理對(duì)象的操作和對(duì)本地對(duì)象的操作對(duì)它來說沒有區(qū)別。
- 對(duì)于傳輸過程而言茫打,Binder是可以進(jìn)行跨進(jìn)程傳遞的對(duì)象居触;Binder驅(qū)動(dòng)會(huì)對(duì)具有跨進(jìn)程傳遞能力的對(duì)象做特殊處理:自動(dòng)完成代理對(duì)象和本地對(duì)象的轉(zhuǎn)換妖混。
Binder模糊了進(jìn)程邊界,淡化了進(jìn)程間通信過程轮洋,整個(gè)系統(tǒng)仿佛運(yùn)行與同一個(gè)面向?qū)ο蟮某绦蛑兄剖校涡紊腂inder對(duì)象以及星羅棋布的引用仿佛粘是結(jié)整個(gè)應(yīng)用程序的膠水,這也是Binder在英文中的原意弊予。
Binder的工作過程
Binder的框架采用C/S架構(gòu)祥楣,包含四個(gè)角色: Server,Client汉柒,ServiceManager(SM)以及Binder驅(qū)動(dòng)误褪。其中Server,Client碾褂,SM 運(yùn)行用戶空間兽间,而Binder驅(qū)動(dòng)運(yùn)行在內(nèi)核空間。
例如 一個(gè) Client進(jìn)程想要調(diào)用Server進(jìn)程中的object對(duì)象的一個(gè)add()方法斋扰。
- 首先Server進(jìn)程要向SM注冊(cè)渡八;告訴自己是誰,自己有什么能力传货;例如 它叫zhangsan屎鳍,它有一個(gè)object對(duì)象,可以執(zhí)行add 操作问裕;于是SM建立了一張表:zhangsan這個(gè)名字對(duì)應(yīng)進(jìn)程Server;
- 然后Client向SM查詢:我需要聯(lián)系一個(gè)名字叫做zhangsan的Server 進(jìn)程里面的object對(duì)象逮壁;這時(shí)候關(guān)鍵來了:進(jìn)程之間通信的數(shù)據(jù)都會(huì)經(jīng)過運(yùn)行在內(nèi)核空間里面的Binder驅(qū)動(dòng),Binder驅(qū)動(dòng)在數(shù)據(jù)流過的時(shí)候做了一點(diǎn)手腳粮宛,它并不會(huì)給Client進(jìn)程返回一個(gè)真正的object對(duì)象窥淆,而是返回一個(gè)看起來跟object一模一樣的代理對(duì)象objectProxy,這個(gè)objectProxy也有一個(gè)add方法巍杈,但是這個(gè)add方法只是一個(gè)傀儡忧饭,并沒有Server進(jìn)程里面object對(duì)象的add方法那個(gè)能力,它唯一做的事情就是把參數(shù)包裝然后交給Binder驅(qū)動(dòng)筷畦。但是Client進(jìn)程并不知道Binder驅(qū)動(dòng)返回給它的對(duì)象動(dòng)過手腳词裤,畢竟偽裝的太像了,如假包換鳖宾。Client開開心心地拿著objectProxy對(duì)象然后調(diào)用add方法吼砂;我們說過,這個(gè)add什么也不做鼎文,直接把參數(shù)做一些包裝然后直接轉(zhuǎn)發(fā)給Binder驅(qū)動(dòng)渔肩。
- 最后Binder驅(qū)動(dòng)收到這個(gè)消息,發(fā)現(xiàn)是這個(gè)objectProxy拇惋;一查表就明白了:我之前用objectProxy替換了object發(fā)送給Client了周偎,它真正應(yīng)該要訪問的是object對(duì)象的add方法抹剩;于是Binder驅(qū)動(dòng)通知Server進(jìn)程,調(diào)用你的object對(duì)象的add方法蓉坎,然后把結(jié)果發(fā)給我吧兔,Sever進(jìn)程收到這個(gè)消息,照做之后將結(jié)果返回Binder驅(qū)動(dòng)袍嬉,Binder驅(qū)動(dòng)然后把結(jié)果返回給Client進(jìn)程;于是整個(gè)過程就完成了灶平。
由于Binder驅(qū)動(dòng)返回的objectProxy與Server進(jìn)程里面原始的object是如此相似伺通,給人感覺好像是直接把Server進(jìn)程里面的對(duì)象object傳遞到了Client進(jìn)程;而實(shí)際上Client進(jìn)程只不過是持有了Server端的代理對(duì)象而已逢享;代理對(duì)象協(xié)助驅(qū)動(dòng)完成了跨進(jìn)程通信罐监。因此,我們可以說Binder對(duì)象是可以進(jìn)行跨進(jìn)程傳遞的對(duì)象
Binder使用場(chǎng)景
Android開發(fā)中瞒爬,Binder主要用于在Service中弓柱,包括AIDL和Messager,其中普通服務(wù)中的Binder不涉及到進(jìn)程通信侧但,另外矢空,ContentProvider底層實(shí)現(xiàn)也是Binder,
所以Binder的使用場(chǎng)景如下:
參考鏈接:
Android 開發(fā)藝術(shù)探索