Binder

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ì)象

  1. Binder 本地對(duì)像:AIDL接口實(shí)現(xiàn)端的對(duì)象
  2. 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()方法斋扰。

  1. 首先Server進(jìn)程要向SM注冊(cè)渡八;告訴自己是誰,自己有什么能力传货;例如 它叫zhangsan屎鳍,它有一個(gè)object對(duì)象,可以執(zhí)行add 操作问裕;于是SM建立了一張表:zhangsan這個(gè)名字對(duì)應(yīng)進(jìn)程Server;
  2. 然后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)渔肩。
  3. 最后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ù)探索

Android Binder之應(yīng)用層總結(jié)與分析

Binder學(xué)習(xí)指南

Android面試一天一題(Day 35:神秘的Binder機(jī)制)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禀横,一起剝皮案震驚了整個(gè)濱河市屁药,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柏锄,老刑警劉巖酿箭,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趾娃,居然都是意外死亡缭嫡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門抬闷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妇蛀,“玉大人,你說我怎么就攤上這事饶氏〖ズ模” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵疹启,是天一觀的道長(zhǎng)古程。 經(jīng)常有香客問我,道長(zhǎng)喊崖,這世上最難降的妖魔是什么挣磨? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任雇逞,我火速辦了婚禮,結(jié)果婚禮上茁裙,老公的妹妹穿的比我還像新娘塘砸。我一直安慰自己,他們只是感情好晤锥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布掉蔬。 她就那樣靜靜地躺著,像睡著了一般矾瘾。 火紅的嫁衣襯著肌膚如雪女轿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天壕翩,我揣著相機(jī)與錄音蛉迹,去河邊找鬼。 笑死放妈,一個(gè)胖子當(dāng)著我的面吹牛北救,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芜抒,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼珍策,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了挽绩?” 一聲冷哼從身側(cè)響起膛壹,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唉堪,沒想到半個(gè)月后模聋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唠亚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年链方,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶搜。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祟蚀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出割卖,到底是詐尸還是另有隱情前酿,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布鹏溯,位于F島的核電站罢维,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丙挽。R本人自食惡果不足惜肺孵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一匀借、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧平窘,春花似錦吓肋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紫新,卻和暖如春屑咳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弊琴。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杖爽,地道東北人敲董。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慰安,于是被迫代替她去往敵國(guó)和親腋寨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容