在Linux系統中,是以進程爲單位分配和管理資源的。出於保護機制,一個進程不能直接訪問另外一個進程的資源,也就是說,進程之間互相封閉。可是,在一個複雜的應用系統中,一般會使用多個相關的進程來共同完成一項任務,所以要求進程之間必須可以互相通訊,從而共享資源和信息。因此,操做系統內核必須提供進程間的通訊機制(IPC)。在Linux中,進程間的通訊機制有不少種,例如能夠採用命名管道(named pipe)、消息隊列(message queue)、信號( signal)、共享內存(share memory)、socket等方式,它們均可以實現進程間的通訊。可是,在Android終端上的應用軟件的通訊幾乎看不到這些IPC通訊方式,取而代之的是Binder方式。Android同時爲Java環境和C/C++環境提供了Binder機制。本章主要介紹C/C++環境下的Binder機制,主要包括Binder驅動的實現、運做原理、IPC機制的實現、接口等.咱們將詳細講解。安全
3.1 Binder概述異步
應用程序雖然是以獨立的進程運行的,但相互之間仍是須要通訊,好比,在多進程的環境下,應用程序和後臺服務一般會運行在不一樣的進程中,有着獨立的地址空間,可是由於須要相互協做,彼此間又必須進行通訊和數據共享,這就須要進程通訊來完成。在Linux系統中,進程間通訊的方式有socket、named pipe、message queue、signal、share memory等;Java系統中的進程間通訊方式也有socket、narned pipe等,因此Android能夠選擇的進程間通訊的方式也不少,可是它主要包括如下幾種方式:socket
(1)標準Linux Kemel IPC接口spa
(2)標準D-BUS接口操作系統
(3)Binder接口線程
3.1.1 爲何選擇Binder教程
在上面這些可供選擇的方式中,Android使用得最多也最被承認的仍是Binder機制。爲什麼會選擇Binder來做爲進程之間的通訊機制呢?由於Binder更加簡潔和快速,消耗的內存資源更小嗎?不錯,這些也正是Binder的優勢。固然,也還有不少其餘緣由,好比傳統的進程間通訊可能會增長進程的開銷,並且有進程過載和安全漏洞等方面的風險,Binder正好能解決和避免這些問題。Binder主要能提供如下一些功能:接口
(1)用驅動程序來推動進程間的通訊。隊列
3.1.2初識Binder進程
Binder是經過Linux的Binder Driver來實現的,Binder操做相似於線程遷移(thread migration),兩個進程間通訊看起來就像是一個進程進入另外一個進程去執行代碼,而後帶着執行的結果返回。Binder的用戶空間爲每個進程維護着一個可用的線程池,線程池用於處理到來的IPC以及執行進程的本地消息,Binder通訊是同步的而不是異步的。同時,Binder機制是基於OpenBindero來實現的,是一個OpenBinder的Linux實現,Android系統的運行都將依賴Binder驅動。 Binder通訊也是基於Service與Client的,全部須要IBinder通訊的進程都必須建立一個IBinder接口。系統中有一個名爲Service Manager的守護進程管理着系統中的各個服務,它負責監聽是否有其餘程序向其發送請求,若是有請求就響應,若是沒有則繼續監聽等待。每一個服務都要在Service Manager中註冊,而請求服務的客戶端則向Service Manager請求服務。在Android虛擬機啓動以前,系統會先啓動Service Manager進程,Service Manager就會打開Binder驅動,並通知Binder Kemel驅動程序,這個進程將做爲System Service Manager,而後該進程將進入一個循環,等待處理來自其餘進程的數據。所以,咱們也能夠將Binder的實現大體分爲:Binder驅動、Service Manager、Service、Client這幾個部分,在後面教程中分別對這幾個部分進行詳細分析。