為什么Android要設(shè)計(jì)Binder呢?

為什么Android要設(shè)計(jì)Binder呢?直接用Linux的IPC通信機(jī)制不行嗎?

  • 一是因?yàn)锳ndroid系統(tǒng)相比于Linux,對安全性有更高的要求,Android中的每個(gè)應(yīng)用都是一個(gè)沙盒模型,不能訪問其他應(yīng)用的數(shù)據(jù),每個(gè)進(jìn)程之間也不能直接訪問其他進(jìn)程的數(shù)據(jù),相比于Android,Linux的限制就松了很多,所以PC的系統(tǒng)的病毒也比手機(jī)系統(tǒng)的病毒多很多,因?yàn)镻C系統(tǒng)中一個(gè)進(jìn)程的訪問權(quán)限會大很多。
  • 二是因?yàn)锳ndroid的IPC場景也會比Linux多很多,一個(gè)程序可能需要頻繁的獲取系統(tǒng)中其他進(jìn)程的信息,比如電量,通訊錄等等,并且前面提到的安全性的限制,也會使Android的IPC場景比Linux中的IPC場景更加頻繁。

那么需要怎么設(shè)計(jì)呢?

  • 性能
  • 安全
  • 可擴(kuò)展性和低耦合性

性能

在Linux系統(tǒng)中,進(jìn)程間傳輸數(shù)據(jù)性能最好的方式就是共享內(nèi)存,或是以共享內(nèi)存為原理衍生出來的技術(shù),如mmap內(nèi)存映射。

  • 共享內(nèi)存或者mmap都只需要進(jìn)行一次數(shù)據(jù)拷貝,即把想要傳輸?shù)臄?shù)據(jù)拷貝到共享或者映射的內(nèi)存區(qū)域中,另一個(gè)共享或者映射了這段內(nèi)存的進(jìn)程就可以直接使用內(nèi)存中的數(shù)據(jù)了.
  • 其他的IPC傳輸都需要兩次拷貝,即將傳輸?shù)臄?shù)據(jù)拷貝的指定的內(nèi)存區(qū)域(一般是內(nèi)核空間),然后又將指定的內(nèi)存區(qū)域的數(shù)據(jù)拷貝到需要通信的進(jìn)程的內(nèi)存中去。

所以為了性能考慮,Binder在設(shè)計(jì)時(shí),采用了mmap內(nèi)存映射這種方式來進(jìn)行數(shù)據(jù)的傳輸

安全性

  • Binder設(shè)計(jì)中為了安全性的考慮, 天然支持?jǐn)y帶進(jìn)程ID,這樣在進(jìn)程間通信時(shí),可以通過進(jìn)程ID進(jìn)程相應(yīng)的權(quán)限控制

  • 并且Binder是CS架構(gòu),Servcer更容易對Client的訪問權(quán)限進(jìn)行控制。

可擴(kuò)展和低耦合

Binder的可擴(kuò)展和低耦合體現(xiàn)在兩個(gè)方面的架構(gòu)上

  • 一是它的C/S架構(gòu)s合計(jì),在CS架構(gòu)上,Clinet和Server都容易擴(kuò)展,想要擴(kuò)展通信,只需要增加Client或者Server就可以了,而不用去管中間的通信流程。
  • 二是基于驅(qū)動的架構(gòu)設(shè)計(jì),在Android8.0之前,Binder只在Frameworkd之間使用,Binder掛載在dev/binder目錄下,8.0開始硬件供應(yīng)商部分,如相機(jī),手電筒等硬件進(jìn)程通信也開始使用binder,硬件部分的Binder掛載在/dev/vnbinder或/dev/hwbinder,可以看到,基于驅(qū)動的設(shè)計(jì)下,只需要新增一個(gè)虛擬設(shè)備,就可以很容易的實(shí)現(xiàn)擴(kuò)展Binder通信的范圍。

參考

深入掌握Binder原理(上)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容