前言
經(jīng)過(guò)前面三章的學(xué)習(xí)瞧壮,各位對(duì)Binder框架庆揪,AIDL機(jī)制已經(jīng)有一個(gè)宏觀的概念了,更多的細(xì)節(jié)义矛,各位需要自己再去研究发笔,推薦老羅的《Android系統(tǒng)源代碼情景分析》,市面上講Binder講的組好的書凉翻,沒有之一了讨,這一篇也是完結(jié)篇,我眼中的Binder
Binder-BinderProxy(Java層)和BBinder-BpBinder(Native C++層)
假如你要在java中創(chuàng)建Binder服務(wù)端制轰,請(qǐng)繼承Binder
假如你要在Native中創(chuàng)建Binder服務(wù)端前计,請(qǐng)繼承BBinder
BinderProxy和BpBinder都是Binder驅(qū)動(dòng)創(chuàng)建給你的。你拿來(lái)調(diào)用接口就會(huì)通過(guò)Binder驅(qū)動(dòng)調(diào)用到服務(wù)端的Binder和BBinder
實(shí)名Binder
實(shí)名Binder是只在ServiceManager中注冊(cè)的Binder對(duì)象垃杖,大家可以通過(guò)ServiceManager.getService("服務(wù)A")男杈,拿到服務(wù)A的BinderProxy對(duì)象
匿名Binder
假如進(jìn)程A已經(jīng)持有了進(jìn)程B中服務(wù)Bi的BinderProxyB對(duì)象,服務(wù)B有一個(gè)接口叫做setCallBack(Binder binder).這個(gè)時(shí)候進(jìn)程A也創(chuàng)建一個(gè)服務(wù)A的BinderA调俘,并調(diào)用服務(wù)B setCallBack(BinderA),因?yàn)锽inder驅(qū)動(dòng)幫你在底層實(shí)現(xiàn)了伶棒,所以進(jìn)程B中可以獲得服務(wù)A的BinderProxyA對(duì)象,可以使用BinderProxyA來(lái)操作進(jìn)程A中服務(wù)A彩库。這樣子實(shí)現(xiàn)了進(jìn)程A和B的雙向通信肤无。
實(shí)名Binder和匿名Binder的區(qū)別
透過(guò)現(xiàn)象看本質(zhì),兩者沒有區(qū)別骇钦,一句話總結(jié):服務(wù)端可以創(chuàng)建Binder對(duì)象宛渐,客戶端可以通過(guò)已經(jīng)搭建起來(lái)的Binder通信的接口通知Binder驅(qū)動(dòng)給你創(chuàng)建出來(lái)BinderProxy對(duì)象。
實(shí)名Binder利用的通信接口就是ServiceManager這個(gè)最原始的接口getServcie,addService
匿名Binder利用的通信接口就是工程師自己實(shí)現(xiàn)的setCallBack司忱。
宏觀上看Binder驅(qū)動(dòng)給你提供的功能
1.Binder和BinderProxy對(duì)象的跨進(jìn)程通信的功能
2.跨進(jìn)程傳遞Binder對(duì)象時(shí)皇忿,客戶端拿到的對(duì)象不是Binder畴蹭,而是Binder驅(qū)動(dòng)生成BinderProxy對(duì)象
Binder機(jī)制為了提升性能坦仍,做了一件事
假如BinderProxy和Binder都在同一進(jìn)程中,如果這兩者的通信還要通過(guò)Binder驅(qū)動(dòng)不是太浪費(fèi)了嗎叨襟,直接拿Binder對(duì)象繁扎,作為普通的類來(lái)調(diào)用不就好了嗎?所以Binder機(jī)制的工程師早就幫你們想好了糊闽,在為客戶端生成BinderProxy對(duì)象的時(shí)候梳玫,會(huì)判斷是不是同一進(jìn)程,如果是同一進(jìn)程就把Binder對(duì)象直接返回給客戶端右犹。
看源碼的技巧
很多人看源碼很容易迷失的原因就是因?yàn)楦悴磺宄?wù)端和客戶端提澎,調(diào)來(lái)調(diào)去就亂了。你們只要永遠(yuǎn)記住這句話就不會(huì)亂了:Binder(服務(wù)端)和BinderProxy(客戶端)成對(duì)出現(xiàn)念链,服務(wù)端和客戶端在同一進(jìn)程中盼忌,Binder驅(qū)動(dòng)為了性能會(huì)自動(dòng)返回Binder對(duì)象而不是BinderProxy积糯。
小結(jié)
小編終于把自己理解的Binder都寫出來(lái)了,源碼比較少谦纱,更多的是從大局觀上看待Binder看成,更多的細(xì)節(jié)可以看《Android系統(tǒng)源代碼情景分析》,建議大家買一個(gè)本這個(gè)書支持一下老羅跨嘉,因?yàn)槲蚁M狭_可以出第二本有關(guān)SurfaceFlinger的川慌。