(一)什麼是binder
隨著android行動裝置平台系統的發展,Binder機製得到越來越多人的關注的。什麼是binder,總體上說,Binder是一個輕量級的IPC組件架構,binder是一個分布式的組件架構,它類似於COM和CORBA。一個叫做open-binder的開源項目,在Android的作業系統上的實現後,就成了現在人們在android上看到的binder。
所以binder不是一個新技術和新想法,Binder在android之前就存在了。它最在開發在BeOS上,後來在Palm OS Cobalt得到產品化。andorid裡的binder基本上binder的作者按照binder最初的設計思想參考Palmsource開放出來的 開源項目openbinder在android裡面重新實現的。
(二)binder機制的特點
Android雖然構建在Linux上面,但是在IPC機制方面,沒有利用Linux提供IPC機制,而是自己實現了一套輕量級的IPC機制——binder機制。binder的如下特性,使得它成為android不可或缺的一部分:
(1) 具有分布式的架構。
(2)面向系統級的開發。
面向系統層的,而不是面嚮應用層的。openbinder的目標是進程和IPC,而不是面向跨網路通訊。
(3)本身使用C++語言實現。
(4)多線程編程的支援。
支援多線程編程的各種執行緒模式。不強制使用特定的執行緒模式。
(5) 可支援多作業系統平台。
從BeOS開始, 到Windows和Palm OS Cobalt,再到android。binder都是可以在這些不同平台實現和使用的。binder使用一些組件和對象來呈現一些基本的系統服務,比如進程和共用記憶體。它沒有試圖取代和隱藏作業系統中那些傳統的概念,而是擁抱和超越它們。這使得binder可以支援大多數的傳統作業系統平台。
(6)良好的硬體伸縮性。
對硬體要求很低。從50MHz ARM 7 CPU (without memory protection) 到 400MHz ARM 9 CPU,以及更強大的CPU。
(7). 使用者可定製性高。
作為IPC的機制實現,串聯了系統裡的大部分組件,並且將各個組件之間的耦合行降到最低。各個組件的可以自由修改和替換,提高了使用者的可定製性。
(8)Binder對硬體要求很低,這正好符合android的實際情況,android的產品線廣泛,晶片主頻各個層次的都有,要在低端的機器上跑的順暢,軟體本身的效能要求還是很重要。
(三)binder應用程式模型
一個IPC通訊我們可以簡單理解成用戶端-伺服器模式,用戶端請求服務,服務端接收到用戶端請求後處理相應,或可能帶回結果返回給用戶端。binder機制在android系統的進程間通訊模型總結如下:
(1)用戶端通過某種方式得到伺服器端的代理對象。從用戶端角度看來代理對象和他的本機物件沒有什麼差別。它可以像其他本機物件一樣調用其方法,訪問其變數。
(2)用戶端通過調用代理對象的方法向伺服器端發送請求資訊。
(3)代理對象通過binder裝置節點(/dev/binder),把使用者請求資訊發送到Linux核心空間(實際上是記憶體共用),由Binder驅動擷取並發送到服務進程。
(4)服務進程處理使用者請求,並通過Linux核心的Binder驅動返回處理結果給用戶端的代理對象。
(5)用戶端收到服務端的返回結果。
整個過程大致如上所述,可以想象一下bingder機制的引入,給進程間的通訊帶來什麼好處?沒錯,就是“線程遷移”,就像是一個線程帶著參數,進入另一個進程執行,然後帶著結果返回,和調用自己的函數一樣的效果。
本文暫不對binder機制的細節進行描述,在後續文章中會有對binder機制進行詳細分析。這裡我們先來看看binder機制的架構組成。
(四)Binder機制的組成
(1)Binder驅動
binder是核心中的一個字元驅動裝置位於/dev/binder。這個裝置是Android系統IPC的核心部分,用戶端的服務代理用來通過它向伺服器(server)發送請求,伺服器也是通過它把處理結果返回給用戶端的服務代理對象。這部分內容,在Android中通過一個IPCThreadState對象封裝了對Binder驅動的操作。
(2)Service Manager
這個東西主要用來負責管理服務。Android中提供的系統服務都要通過Service Manager註冊自己,將自己添加進服務管理鏈表中,為用戶端提供服務。而用戶端如果要和特定的系統服務端通訊,就需要向Service Manager來查詢和獲得所需要服務。可以看出Service Manager是系統服務物件的管理中心。
(3)服務(Server)
需要強調的是這裡服務是指的是System Server,而不是SDK server,向用戶端提供服務。
(4)用戶端
一般是指Android系統上面的應用程式。它可以請求Server中的服務。
(5)代理對象
是指在用戶端應用程式中擷取產生的Server代理(proxy)類對象。從應用程式角度看代理對象和本機物件沒有差別,都可以調用其方法,方法都是同步的,並且返回相應的結果。
binder機制的實現使用C/C++實現的,但在android的應用程式中,也會有java部分的內容。下面會介紹binder機制中的“服務管家”--service manager。