我們知道输钩,Android系統(tǒng)是基于Linux內(nèi)核的反镇。而Linux的進(jìn)程又遵循進(jìn)程隔離機(jī)制奋蔚,導(dǎo)致進(jìn)程之間不能進(jìn)行互相通信势腮。 但是联贩,Android系統(tǒng)沒有采用上述提到的各種進(jìn)程間通信機(jī)制,而是采用Binder機(jī)制捎拯。Binder是一種進(jìn)程間通信機(jī)制泪幌,其實是提供遠(yuǎn)程過程調(diào)用(RPC)功能。
在Android系統(tǒng)的Binder機(jī)制中署照,由一系統(tǒng)組件組成祸泪,分別是Client、Server藤树、Service Manager和Binder驅(qū)動程序,其中Client拓萌、Server和Service Manager運行在用戶空間岁钓,Binder驅(qū)動程序運行內(nèi)核空間。Binder就是一種把這四個組件粘合在一起的粘結(jié)劑了,其中屡限,核心組件便是Binder驅(qū)動程序了品嚣,Service Manager提供了輔助管理的功能,Client和Server正是在Binder驅(qū)動和Service Manager提供的基礎(chǔ)設(shè)施上钧大,進(jìn)行Client-Server之間的通信翰撑。
Service Manager和Binder驅(qū)動已經(jīng)在Android平臺中實現(xiàn)好,開發(fā)者只要按照規(guī)范實現(xiàn)自己的Client和Server組件就可以了啊央。
1眶诈、什么是Binder
1.1通常Binder就是一種跨進(jìn)程的通信機(jī)制
1.2對于Server進(jìn)行來說,Binder指的是Binder本地對象瓜饥。對于Client來說Binder指的是Binder的代理對象逝撬。
1.3對于傳輸過程而言,Binder是可以進(jìn)行跨進(jìn)程傳遞的對象乓土。
2宪潮、Binder通信模型
2.1、ServiceManager的建立趣苏,首先有一個進(jìn)程向驅(qū)動提出申請為ServiceManager狡相。而內(nèi)核驅(qū)動同意后ServiceManager就負(fù)責(zé)管理所以的進(jìn)程服務(wù)
2.2、Server1啟動以后就會向ServiceManager進(jìn)行注冊食磕,然后ServiceManager會分配給Server1一個虛擬地址尽棕。ServiceManager有一個表對應(yīng)這個各個服務(wù)的名稱和地址
2.3、Client和Server1進(jìn)行通信芬为,首先它會向ServiceManager查詢Server1服務(wù)萄金,然后ServiceManager會返回Server1代理對象。然后Client通過Binder和Server1進(jìn)行通信
3媚朦、Binder是如何進(jìn)行跨進(jìn)程通信
假設(shè)Client想要調(diào)用Server端返回值是Object的add方法氧敢,這就是跨進(jìn)程通信的機(jī)制
3.1Server會向ServiceManager進(jìn)行注冊,告訴ServiceManager我這里有一個返回值是Object的add方法询张。ServiceManager并把它記錄在表里孙乖。
3.2Client向ServiceManager進(jìn)行查詢,Server有沒有一個返回值是Object的add方法份氧。進(jìn)程間的通信數(shù)據(jù)都是在內(nèi)核空間里唯袄,這時候驅(qū)動會在數(shù)據(jù)流的時候做一些封裝。ServiceManager并不會真正返回Client端一個真正的Server Object對象蜗帜,因為它是無法進(jìn)行操作的(進(jìn)程的隔離機(jī)制)恋拷。而是返回一個Server端的代理對象,而這個代理對象中包含了一個add方法厅缺。這個add方法是一個空方法這里面什么都沒有蔬顾,它沒有進(jìn)行計算的能力宴偿。而這個代理對象要做的就是把數(shù)據(jù)包裝好交給內(nèi)部驅(qū)動來實現(xiàn)。
3.3驅(qū)動收到了Client發(fā)給他的代理對象add方法诀豁,然后去ServiceManager的表里進(jìn)行查詢窄刘。這個代理對象替換了Server的add方法,查詢到之后驅(qū)動會調(diào)用Server的add進(jìn)行計算舷胜。Server會把計算結(jié)果返回給驅(qū)動娩践,然后驅(qū)動返回給Client端。
3.4Binder驅(qū)動作為Client端和Server端的中介烹骨,進(jìn)行了一個進(jìn)程間通信的機(jī)制翻伺。
總結(jié):客戶端進(jìn)程只不過是持有了一個服務(wù)端的代理,通過代理對象協(xié)助驅(qū)動實現(xiàn)了跨進(jìn)程通信展氓。具體的跨進(jìn)程通信都是通過代理對象來協(xié)助完成的穆趴。