參考:
Android Bander設(shè)計與實現(xiàn) - 設(shè)計篇
Binder學(xué)習指南
github_Binder機制
其中的各種概念和比喻讓我看的十分痛苦,不知道是我的理解能力太差,還是人類的語言太蒼白布蔗。我按自己的理解整理出一下筆記孔飒。主要是對概念的梳理,刨除比喻凛膏,以簡要的文字腿宰,把我從這三篇文章中理解到的內(nèi)容闡述出來,理解深度也根據(jù)自己的水平來覆劈。當時內(nèi)心急躁保礼,沒有細看,也沒有全看责语。有人看到我這篇文章了炮障,如發(fā)現(xiàn)問題,歡迎指正坤候。
(Android系統(tǒng)所基于的)Linux內(nèi)核基礎(chǔ)知識(為什么需要跨進程)
- 進程隔離/虛擬地址空間:每個進程對應(yīng)一個虛擬地址空間铝阐,不同進程數(shù)據(jù)不共享。
- 系統(tǒng)調(diào)用:Linux分內(nèi)核空間和用戶空間铐拐,應(yīng)用程序存在于用戶空間徘键,不能直接訪問內(nèi)核空間练对,但可以通過系統(tǒng)調(diào)用間接訪問。這樣間接的方式可對訪問權(quán)限進行限制吹害,保證系統(tǒng)的安全螟凭。跨進程通信的原理它呀,就是通過系統(tǒng)調(diào)用功能螺男,使用內(nèi)核空間作為橋梁,完成不同應(yīng)用程序間的通信纵穿。
為什么使用Binder
- Android廣泛使用跨進程通信
- 性能:Binder拷貝數(shù)據(jù)的次數(shù)少下隧,性能比socket、管道谓媒、消息隊列等方式更高效
- 安全:Binder支持對通信雙方進行身份校驗
Binder通信模型
- Binder驅(qū)動:“驅(qū)動”是保證計算機能操作硬件設(shè)備的一小塊代碼淆院,與此類似,“Binder驅(qū)動”是Android系統(tǒng)中保證Binder對象能操作內(nèi)核空間的一小塊代碼句惯。
- Binder(對象土辩,或?qū)嶓w):提供了間接訪問內(nèi)核空間的功能,由Server創(chuàng)建并向ServiceManager注冊抢野,Client可以通過對Binder對象的引用與Server進行通信拷淘。所謂注冊,就是將對象的名字和引用的映射關(guān)系記錄在ServiceManager中指孤。
- Binder引用(或代理對象):Client對Binder對象所持有的引用启涯,或稱代理對象,由Binder驅(qū)動根據(jù)Binder對象創(chuàng)建恃轩。Client通過它可以調(diào)用Binder對象的功能结洼,實現(xiàn)方式由Binder驅(qū)動完成。
- Client和Server(進程):假設(shè)發(fā)起和接收通信請求的進程分別為Client和Server详恼。
- ServiceManager(進程):作用是將字符形式的Binder名字轉(zhuǎn)化成Client中對該Binder的引用,使得Client能夠通過Binder名字獲得Binder引用引几。(ServiceManager也是一個進程昧互,對于ServiceManager而言,其他所有的進程都是Client伟桅,也就是說敞掘,它是其他所有進程的Server。它的Binder引用是0號引用楣铁,該Binder沒有名字也不需要注冊玖雁。其它進程要通過0號引用向ServiceManager發(fā)起注冊Binder或獲取Binder引用的請求)
- Client、Server盖腕、ServiceManager運行于用戶空間赫冬,Binder驅(qū)動運行于內(nèi)核空間浓镜。
- 通信流程:
- ServiceManager的建立:進程向Binder驅(qū)動申請為ServiceManager,此時進程還沒有區(qū)分為Client角色或Server角色劲厌,所以統(tǒng)稱之為Service膛薛。(我理解的建立是,其他進程通過0號引用和ServiceManager建立了連接补鼻,不知道是不是這樣)
- Server創(chuàng)建Binder對象并向ServiceManager注冊哄啄。
- Client通過Binder的名字向ServiceManager查詢和獲取Binder引用。
- Client通過Binder引用與Server通信风范,Binder通過操作內(nèi)核空間咨跌,實現(xiàn)了兩者的跨進程通信。
擴展
匿名Binder:沒有向ServiceManager注冊的Binder對象硼婿,即該Binder對象的引用沒有公開锌半,能收到此匿名Binder引用的Client,便可以和Server建立起一條私密的通道加酵。(具體Client怎么才能收到拳喻,在文章中沒找到)
Binder的總結(jié)
- 通常意義下,Binder指的是一種通信機制猪腕。(以上的Binder是Binder對象的簡稱)
- 對于Server進程來說冗澈,Binder對象指的是Binder本地對象,對于Client來說陋葡,Binder對象指的是Binder代理對象亚亲。
- 對于傳輸過程而言,Binder對象是可以進行跨進程傳遞的對象腐缤。