Android 面試題之介紹源碼中binder機制

面試問到這個,其實就是讓你說一下binder是干什么的,Service Manager是如何成為一個守護進程的

Binder是干什么的

Binder -- 一種進程間通信(IPC)機制, 基于OpenBinder

    1. Client、Server和Service Manager實現(xiàn)在用戶空間中,Binder驅(qū)動程序?qū)崿F(xiàn)在內(nèi)核空間中
    1. Binder驅(qū)動程序和Service Manager在Android平臺中已經(jīng)實現(xiàn),開發(fā)者只需要在用戶空間實現(xiàn)自己的Client和Server
    1. Binder驅(qū)動程序提供設(shè)備文件/dev/binder與用戶空間交互,Client、Server和Service Manager通過open和ioctl文件操作函數(shù)與Binder驅(qū)動程序進行通信
    1. Client和Server之間的進程間通信通過Binder驅(qū)動程序間接實現(xiàn)
    1. Service Manager是一個守護進程,用來管理Server,并向Client提供查詢Server接口的能力

1.Service Manager是如何成為一個守護進程的?即Service Manager是如何告知Binder驅(qū)動程序它是Binder機制的上下文管理者。

Service Manager,它是整個Binder機制的守護進程,用來管理開發(fā)者創(chuàng)建的各種Server,并且向Client提供查詢Server遠程接口的功能

既然Service Manager組件是用來管理Server并且向Client提供查詢Server遠程接口的功能,那么,Service Manager就必然要和Server以及Client進行通信了。我們知道,Service Manger、Client和Server三者分別是運行在獨立的進程當(dāng)中,這樣它們之間的通信也屬于進程間通信了,而且也是采用Binder機制進行進程間通信,因此,Service Manager在充當(dāng)Binder機制的守護進程的角色的同時,也在充當(dāng)Server的角色,然而,它是一種特殊的Server,下面我們將會看到它的特殊之處

Service Manager在用戶空間的源代碼位于frameworks/base/cmds/servicemanager目錄下,主要是由binder.h、binder.c和service_manager.c三個文件組成。Service Manager的入口位于service_manager.c文件中的main函數(shù):

int main(int argc, char **argv)
{
    struct binder_state *bs;
    void *svcmgr = BINDER_SERVICE_MANAGER;

    bs = binder_open(128*1024);

    if (binder_become_context_manager(bs)) {
        LOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
    }

    svcmgr_handle = svcmgr;
    binder_loop(bs, svcmgr_handler);
    return 0;
}

main函數(shù)主要有三個功能:一是打開Binder設(shè)備文件;二是告訴Binder驅(qū)動程序自己是Binder上下文管理者,即我們前面所說的守護進程;三是進入一個無窮循環(huán),充當(dāng)Server的角色,等待Client的請求

2. Server和Client是如何獲得Service Manager接口的?即defaultServiceManager接口是如何實現(xiàn)的。

ServiceManager 作為守護進程,Service Manager的職責(zé)當(dāng)然就是為Server和Client服務(wù)了。那么,Server和Client如何獲得Service Manager接口,進而享受它提供的服務(wù)呢?

Service Manager在Binder機制中既充當(dāng)守護進程的角色,同時它也充當(dāng)著Server角色,然而它又與一般的Server不一樣。對于普通的Server來說,Client如果想要獲得Server的遠程接口,那么必須通過Service Manager遠程接口提供的getService接口來獲得,這本身就是一個使用Binder機制來進行進程間通信的過程。而對于Service Manager這個Server來說,Client如果想要獲得Service Manager遠程接口,卻不必通過進程間通信機制來獲得,因為Service Manager遠程接口是一個特殊的Binder引用,它的引用句柄一定是0。

經(jīng)過一系列的調(diào)用...

回到defaultServiceManager函數(shù)中,最終結(jié)果為:

gDefaultServiceManager = new BpServiceManager(new BpBinder(0));

這樣,Service Manager遠程接口就創(chuàng)建完成了,它本質(zhì)上是一個BpServiceManager,包含了一個句柄值為0的Binder引用。

在Android系統(tǒng)的Binder機制中,Server和Client拿到這個Service Manager遠程接口之后怎么用呢?

對Server來說,就是調(diào)用IServiceManager::addService這個接口來和Binder驅(qū)動程序交互了,即調(diào)用BpServiceManager::addService 。而BpServiceManager::addService又會調(diào)用通過其基類BpRefBase的成員函數(shù)remote獲得原先創(chuàng)建的BpBinder實例,接著調(diào)用BpBinder::transact成員函數(shù)。在BpBinder::transact函數(shù)中,又會調(diào)用IPCThreadState::transact成員函數(shù),這里就是最終與Binder驅(qū)動程序交互的地方了。回憶一下前面的類圖,IPCThreadState有一個PorcessState類型的成中變量mProcess,而mProcess有一個成員變量mDriverFD,它是設(shè)備文件/dev/binder的打開文件描述符,因此,IPCThreadState就相當(dāng)于間接在擁有了設(shè)備文件/dev/binder的打開文件描述符,于是,便可以與Binder驅(qū)動程序交互了。

對Client來說,就是調(diào)用IServiceManager::getService這個接口來和Binder驅(qū)動程序交互了。具體過程上述Server使用Service Manager的方法是一樣的,這里就不再累述了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,347評論 2 377

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