進(jìn)程間通信--Android的Binder

一、Binder簡介
Binder是Android特有的一種進(jìn)程間通信(IPC)方式类缤,和傳統(tǒng)的IPC相比恭垦,它融合了遠(yuǎn)程過程調(diào)用(RPC)的概念,而且是一種面向?qū)ο蟮倪h(yuǎn)程調(diào)用漠另。

在Unix的IPC機(jī)制中捏雌,通信雙方必須處理線程同步、內(nèi)存管理等復(fù)雜問題笆搓,不但工作量大腹忽,而且很容易出錯。除了Socket砚作、匿名管理(Pipe)以外窘奏,傳統(tǒng)的IPC如管道(FIFO)、信號量(Semaphore)葫录、消息隊(duì)列等已經(jīng)從Android中去掉了着裹。和其它IPC相比較,Socket是一種比較成熟的通信手段米同,同步控制也很容易實(shí)現(xiàn)骇扇,Socket適合用于網(wǎng)絡(luò)通信,但用于進(jìn)程間通信效率就不太高了面粮。

Android在架構(gòu)上一直希望模糊進(jìn)程的概念少孝,取而代之以組件的概念。應(yīng)用不需要關(guān)心組件存放的位置熬苍、組件的生命周期等問題稍走,隨時隨地,只要擁有Binder對象柴底,就能使用組件的功能婿脸。Binder將整個系統(tǒng)的組件,跨進(jìn)程和線程柄驻,組織在一起狐树。因此,Android系統(tǒng)的服務(wù)都是利用Binder構(gòu)建的鸿脓。Binder是整個系統(tǒng)運(yùn)行的中樞抑钟。

Android在進(jìn)程間傳遞數(shù)據(jù)使用的是共享內(nèi)存的方式涯曲,這樣數(shù)據(jù)只需要復(fù)制一次就能從一個進(jìn)程到達(dá)另一個進(jìn)程(一般的IPC都需要兩步,從用戶進(jìn)程復(fù)制到內(nèi)核在塔,再從內(nèi)核復(fù)制到服務(wù)進(jìn)程)幻件,這樣數(shù)據(jù)傳輸?shù)男示痛蟠筇岣吡恕?/p>

二、 Binder對象的定義

Binder對象主要定義:
1)Binder實(shí)體對象:Binder實(shí)體對象就是Binder服務(wù)的提供者心俗。一個Binder服務(wù)的類必須繼承BBinder類傲武。
2)Binder引用對象:Binder引用對象是Binder實(shí)體對象在客戶進(jìn)程的代表,每個引用對象的類型都是BpBinder類城榛。
3)Binder代理對象:代理對象也稱為接口對象揪利,它主要是為客戶端的上層應(yīng)用提供接口服務(wù),從IInterface類派生狠持。它實(shí)現(xiàn)了Binder服務(wù)的函數(shù)接口疟位,當(dāng)然只是一個調(diào)轉(zhuǎn)的空殼。通過代理對象喘垂,應(yīng)用能像使用本地對象一樣使用遠(yuǎn)端的實(shí)體對象提供的服務(wù)甜刻。
4)IBinder對象:BBinder和BpBinder類都是從IBinder類中繼承而來。

Binder代理對象主要和應(yīng)用程序打交道正勒,將Binder代理對象和引用對象分開的好處是代理對象可以有很多實(shí)例得院,但是它們包含的是同一個引用對象,這樣方便了用戶的使用章贞。
也正是在客戶端將引用對象和代理對象分離祥绞,Android才能用一套架構(gòu)來同時為Java和native層提供Binder服務(wù)。隔離后鸭限,Binder底層不需要關(guān)心上層的實(shí)現(xiàn)細(xì)節(jié)蜕径,只需要和Binder實(shí)體對象和引用對象進(jìn)行交互。


Binder對象關(guān)系圖.png

三败京、 Binder進(jìn)程間通信機(jī)制
Binder通信的參與者由四部分組成:
1)Binder驅(qū)動:Binder的核心兜喻,實(shí)現(xiàn)各種Binder的底層操作。
2)ServiceManager:提供Binder的名稱到引用對象的轉(zhuǎn)換服務(wù)赡麦。
3)服務(wù)端:Binder服務(wù)的提供者朴皆。
4)客戶端:Binder服務(wù)的使用者。
它們間的關(guān)系如下圖所求:

Binder進(jìn)程間通信機(jī)制.png

Binder驅(qū)動位于Binder架構(gòu)的核心隧甚,通過文件系統(tǒng)的標(biāo)準(zhǔn)接口车荔,如open(),ioctl(),mmap()等,向用戶層提供服務(wù)戚扳。應(yīng)用層和Binder驅(qū)動之間的數(shù)據(jù)交換是通過ioctl()接口完成的。Binder驅(qū)動的主要功能是提供Binder通信的通道族吻,維護(hù)Binder對象的引用計(jì)數(shù)帽借,轉(zhuǎn)換傳輸中的Binder實(shí)體對象和引用對象以及管理數(shù)據(jù)緩存區(qū)珠增。

ServiceManager是一個守護(hù)進(jìn)程,它的作用是提供Binder服務(wù)的查詢功能砍艾,返回被查詢服務(wù)的引用蒂教。對于一個Binder服務(wù),通常會有一個唯一的字符串標(biāo)識脆荷,只要它向ServiceManager注冊了這個標(biāo)識凝垛,應(yīng)用就可以通過這個標(biāo)識來獲得服務(wù)的引用對象。ServiceManager是一個單獨(dú)的進(jìn)程蜓谋,實(shí)際上ServiceManager也是通過Binder框架來提供服務(wù)的梦皮。
Android中只有root進(jìn)程或system進(jìn)程才可以不受限制地向ServiceManager注冊服務(wù)。
Binder服務(wù)可以分成兩種:實(shí)名服務(wù)和匿名服務(wù)桃焕。Android中的實(shí)名Binder服務(wù)都是系統(tǒng)提供的剑肯,如ActivityManagerService,PowerManagerService观堂,WindowManagerService等让网,實(shí)名服務(wù)可以通過ServiceManager查詢到。
普通應(yīng)用開發(fā)的Binder服務(wù)师痕,只能是匿名服務(wù)溃睹。它不能通過ServiceManager查詢到,但還是得通過Binder來查詢胰坟。匿名服務(wù)經(jīng)常使用的場景是服務(wù)進(jìn)程回調(diào)客戶進(jìn)程中的函數(shù)因篇。整個過程是:
客戶端和服務(wù)端通過Binder連接上后,客戶端把本地進(jìn)程中創(chuàng)建的匿名服務(wù)的實(shí)體對象作為函數(shù)參數(shù)傳遞到服務(wù)端腕铸,驅(qū)動會在中間把實(shí)體對象“轉(zhuǎn)換”成引用對象惜犀,這樣服務(wù)進(jìn)程就得到了客戶進(jìn)程創(chuàng)建的Binder服務(wù)的引用對象,然后就能回調(diào)客戶進(jìn)程中Binder服務(wù)的函數(shù)了狠裹。
在Java層Android還提供了通過組件Service的方式來包裝和使用匿名服務(wù)虽界。
匿名服務(wù)因?yàn)闆]有ServiceManager來提供名稱解析服務(wù),因此一般只能用于服務(wù)進(jìn)程回調(diào)客戶進(jìn)程涛菠。但是莉御,Android還通過Framework提供了一種啟動Java匿名Binder服務(wù)的方法。這種方法的過程如下:
首先某個應(yīng)用通過調(diào)用bindService()方法發(fā)出一個Intent俗冻,F(xiàn)ramework根據(jù)Intent找到對應(yīng)的組件Service并啟動它礁叔,包在組件Service中的Binder服務(wù)也將同時創(chuàng)建出來。隨后Framework會把服務(wù)的IBinder對象通過ConnectivityManager的回調(diào)方法onServiceConnected()傳回到應(yīng)用迄薄,這樣應(yīng)用就得到匿名Binder服務(wù)的引用對象琅关,也就能使用組件Service中的匿名Binder服務(wù)了。
在這里Framework用Intent代替了Binder服務(wù)的名稱來查找對應(yīng)的服務(wù)讥蔽,同時也承擔(dān)了ServiceManager的工作涣易,解析Intent并傳回服務(wù)的引用對象画机。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市新症,隨后出現(xiàn)的幾起案子步氏,更是在濱河造成了極大的恐慌,老刑警劉巖徒爹,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荚醒,死亡現(xiàn)場離奇詭異,居然都是意外死亡隆嗅,警方通過查閱死者的電腦和手機(jī)界阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榛瓮,“玉大人铺董,你說我怎么就攤上這事≠飨” “怎么了精续?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粹懒。 經(jīng)常有香客問我重付,道長,這世上最難降的妖魔是什么凫乖? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任确垫,我火速辦了婚禮,結(jié)果婚禮上帽芽,老公的妹妹穿的比我還像新娘删掀。我一直安慰自己,他們只是感情好导街,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布披泪。 她就那樣靜靜地躺著,像睡著了一般搬瑰。 火紅的嫁衣襯著肌膚如雪款票。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天泽论,我揣著相機(jī)與錄音艾少,去河邊找鬼。 笑死翼悴,一個胖子當(dāng)著我的面吹牛缚够,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼潮瓶,長吁一口氣:“原來是場噩夢啊……” “哼陶冷!你這毒婦竟也來了钙姊?” 一聲冷哼從身側(cè)響起毯辅,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煞额,沒想到半個月后思恐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膊毁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年胀莹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婚温。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡描焰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栅螟,到底是詐尸還是另有隱情荆秦,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布力图,位于F島的核電站步绸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吃媒。R本人自食惡果不足惜瓤介,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赘那。 院中可真熱鬧刑桑,春花似錦、人聲如沸募舟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胃珍。三九已至梁肿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間觅彰,已是汗流浹背吩蔑。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留填抬,地道東北人烛芬。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赘娄。 傳聞我的和親對象是個殘疾皇子仆潮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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