為什么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通信的范圍。