Binder系列6—獲取服務(wù)(getService)

一愁拭、 獲取服務(wù)

在Native層的服務(wù)注冊,我們選擇以media為例來展開講解亏吝,先來看看media的類關(guān)系圖敛苇。

1.1 類圖


圖解:

藍(lán)色: 代表獲取MediaPlayerService服務(wù)相關(guān)的類;

綠色: 代表Binder架構(gòu)中與Binder驅(qū)動通信過程中的最為核心的兩個類顺呕;

紫色: 代表注冊服務(wù)和獲取服務(wù)的公共接口/父類;

二. 獲取Media服務(wù)

2.1 getMediaPlayerService

[-> framework/av/media/libmedia/IMediaDeathNotifier.cpp]


其中defaultServiceManager()過程在上一篇文章獲取ServiceManager已講過括饶,返回BpServiceManager株茶。

在請求獲取名為”media.player”的服務(wù)過程中,采用不斷循環(huán)獲取的方法图焰。由于MediaPlayerService服務(wù)可能還沒向ServiceManager注冊完成或者尚未啟動完成等情況启盛,故則binder返回為NULL,休眠0.5s后繼續(xù)請求技羔,直到獲取服務(wù)為止僵闯。

2.2 BpSM.getService

[-> IServiceManager.cpp ::BpServiceManager]


通過BpServiceManager來獲取MediaPlayer服務(wù):檢索服務(wù)是否存在,當(dāng)服務(wù)存在則返回相應(yīng)的服務(wù)藤滥,當(dāng)服務(wù)不存在則休眠1s再繼續(xù)檢索服務(wù)鳖粟。該循環(huán)進行5次。為什么是循環(huán)5次呢拙绊,這估計跟Android的ANR時間為5s相關(guān)向图。如果每次都無法獲取服務(wù),循環(huán)5次标沪,每次循環(huán)休眠1s榄攀,忽略checkService()的時間,差不多就是5s的時間

2.3 BpSM.checkService

[-> IServiceManager.cpp ::BpServiceManager]


檢索指定服務(wù)是否存在, 其中remote()為BpBinder金句。

2.4 BpBinder::transact

[-> BpBinder.cpp]


Binder代理類調(diào)用transact()方法檩赢,真正工作還是交給IPCThreadState來進行transact工作,

2.4.1 IPCThreadState::self

[-> IPCThreadState.cpp]


TLS是指Thread local storage(線程本地儲存空間)违寞,每個線程都擁有自己的TLS贞瞒,并且是私有空間,線程之間不會共享趁曼。通過pthread_getspecific/pthread_setspecific函數(shù)可以獲取/設(shè)置這些空間中的內(nèi)容憔狞。從線程本地存儲空間中獲得保存在其中的IPCThreadState對象。

2.4.2 IPCThreadState初始化

[-> IPCThreadState.cpp]


每個線程都有一個IPCThreadState彰阴,每個IPCThreadState中都有一個mIn瘾敢、一個mOut。成員變量mProcess保存了ProcessState變量(每個進程只有一個)。

mIn 用來接收來自Binder設(shè)備的數(shù)據(jù)簇抵,默認(rèn)大小為256字節(jié)庆杜;

mOut用來存儲發(fā)往Binder設(shè)備的數(shù)據(jù),默認(rèn)大小為256字節(jié)碟摆。

2.5 IPC::transact

[-> IPCThreadState.cpp]


2.6 IPC.writeTransactionData

[-> IPCThreadState.cpp]


其中handle的值用來標(biāo)識目的端晃财,注冊服務(wù)過程的目的端為service manager,此處handle=0所對應(yīng)的是binder_context_mgr_node對象典蜕,正是service manager所對應(yīng)的binder實體對象断盛。binder_transaction_data結(jié)構(gòu)體是binder驅(qū)動通信的數(shù)據(jù)結(jié)構(gòu),該過程最終是把Binder請求碼BC_TRANSACTION和binder_transaction_data結(jié)構(gòu)體寫入到mOut愉舔。

2.7 IPC.waitForResponse

[-> IPCThreadState.cpp]


2.8 IPC.talkWithDriver

[-> IPCThreadState.cpp]


binder_write_read結(jié)構(gòu)體用來與Binder設(shè)備交換數(shù)據(jù)的結(jié)構(gòu), 通過ioctl與mDriverFD通信钢猛,是真正與Binder驅(qū)動進行數(shù)據(jù)讀寫交互的過程。 先向service manager進程發(fā)送查詢服務(wù)的請求(BR_TRANSACTION)轩缤,見Binder系列3—啟動ServiceManager命迈。當(dāng)service manager進程收到該命令后,會執(zhí)行do_find_service() 查詢服務(wù)所對應(yīng)的handle火的,然后再binder_send_reply()應(yīng)答 發(fā)起者壶愤,發(fā)送BC_REPLY協(xié)議,然后調(diào)用binder_transaction()馏鹤,再向服務(wù)請求者的Todo隊列 插入事務(wù)征椒。

接下來,再看看binder_transaction過程湃累。

2.8.1 binder_transaction

這個過程非常重要陕靠,分兩種情況來說:

當(dāng)請求服務(wù)的進程與服務(wù)屬于不同進程,則為請求服務(wù)所在進程創(chuàng)建binder_ref對象脱茉,指向服務(wù)進程中的binder_node;

當(dāng)請求服務(wù)的進程與服務(wù)屬于同一進程剪芥,則不再創(chuàng)建新對象,只是引用計數(shù)加1琴许,并且修改type為BINDER_TYPE_BINDER或BINDER_TYPE_WEAK_BINDER税肪。

2.8.2 binder_thread_read

2.9 readStrongBinder

[-> Parcel.cpp]


2.9.1 unflatten_binder

[-> Parcel.cpp]


2.9.2 getStrongProxyForHandle

[-> ProcessState.cpp]


readStrongBinder的功能是flat_binder_object解析并創(chuàng)建BpBinder對象.

2.9.3 lookupHandleLocked


根據(jù)handle值來查找對應(yīng)的handle_entry.

二. 總結(jié)

請求服務(wù)(getService)過程,就是向servicemanager進程查詢指定服務(wù)榜田,當(dāng)執(zhí)行binder_transaction()時益兄,會區(qū)分請求服務(wù)所屬進程情況。

當(dāng)請求服務(wù)的進程與服務(wù)屬于不同進程箭券,則為請求服務(wù)所在進程創(chuàng)建binder_ref對象净捅,指向服務(wù)進程中的binder_node;

最終readStrongBinder(),返回的是BpBinder對象辩块;

當(dāng)請求服務(wù)的進程與服務(wù)屬于同一進程蛔六,則不再創(chuàng)建新對象荆永,只是引用計數(shù)加1,并且修改type為BINDER_TYPE_BINDER或BINDER_TYPE_WEAK_BINDER国章。

最終readStrongBinder()具钥,返回的是BBinder對象的真實子類;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末液兽,一起剝皮案震驚了整個濱河市骂删,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌四啰,老刑警劉巖宁玫,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柑晒,居然都是意外死亡欧瘪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門敦迄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凭迹,你說我怎么就攤上這事罚屋。” “怎么了嗅绸?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵脾猛,是天一觀的道長。 經(jīng)常有香客問我鱼鸠,道長猛拴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任蚀狰,我火速辦了婚禮愉昆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麻蹋。我一直安慰自己跛溉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布扮授。 她就那樣靜靜地躺著芳室,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刹勃。 梳的紋絲不亂的頭發(fā)上堪侯,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音荔仁,去河邊找鬼伍宦。 笑死芽死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雹拄。 我是一名探鬼主播收奔,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滓玖!你這毒婦竟也來了坪哄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤势篡,失蹤者是張志新(化名)和其女友劉穎翩肌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禁悠,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡念祭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碍侦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粱坤。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓷产,靈堂內(nèi)的尸體忽然破棺而出站玄,到底是詐尸還是另有隱情,我是刑警寧澤濒旦,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布株旷,位于F島的核電站,受9級特大地震影響尔邓,放射性物質(zhì)發(fā)生泄漏晾剖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一梯嗽、第九天 我趴在偏房一處隱蔽的房頂上張望齿尽。 院中可真熱鬧,春花似錦灯节、人聲如沸雕什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贷岸。三九已至,卻和暖如春磷雇,著一層夾襖步出監(jiān)牢的瞬間偿警,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工唯笙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留螟蒸,地道東北人盒使。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像七嫌,于是被迫代替她去往敵國和親少办。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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