深入理解 Android 的 IPC 机制--------Binder
在android中,,應用程序雖然是以獨立的進程來運行的,但相互之間還是需要通信。。比如,,我們的應用程序 和后臺服務往往會運行不同的進程當中,,各自有這獨立內存地址空間,,,但是又要彼此互相合作,,,需要進行通信和數據共享,,在linux下,進程通信的方式有? socket,,named pipe命名管道,,signal? 信號,,message? queue? 消息隊列,,share memory 共享內存等。。
???????????但是android 選擇了Binder,,,是因為他更加簡潔和快速,,消耗的內存更小,,而且因為傳統的進程通信可能會增加進程的開銷,,而且有進程過載和安全漏洞,,,Binder正好能避免這類問題。。。他提供的功能有:
用驅動程序來推進進程間的通信。。
通過共享內存來提高性能。。
為進程請求分配每個進程的線程池。。
針對系統中的對象引入了引用計數和跨進程的對象引用映射。。
進程間同步調用。。。
Binder 是通過 linux的binder driver 來實現的,兩個進程間通信看起來就像是一個進程進入另一個進程去執行代碼,,,然后帶著執行結果返回。。。這個操作類似于線程遷移,,java中的代碼遷移。。。
Binder通信是同步而不是異步的,,,Android系統的運行都將依賴于Binder驅動。。。
Binder 通信也是基于 我們的service端和客戶端得,,,所有需要進行通信的進程都必須實現Ibinder接口。。。系統中有一個 service manager 后臺線程管理著所有service,,,它監聽這所有程序是否向它發送請求,,,。。
在android虛擬機啟動之前,,,他會先啟動service manager 進程,,然后會打開Binder driver,通知Binder kernel驅動程序它要作為System service manager,,然后開始一個循環等待處理其他進程的數據。。
?
???????????為了完成進程間通信,Binder采用了AIDL(android interface definition language)來描述進程間的接口。。
Binder不僅是Android系統中的一個完善的IPC機制,,它也可以被當做Android系統的一種RPC機制,,remote process connection? ,,因為Binder 的功能就是在本地執行其他進程的功能。。在某個進程通過Binder獲取要調用的進程服務時,,可以是一個本地調用,也可以是一個遠程的服務。
????????? Binder的實質就是要把對象從一個進程映射到另一個進程當中,不管這個對象是本地的還是遠程的。如果是遠程對象,就是將遠程對象的引用從一個進程映射到另一個進程,當使用這個遠程對象時,可以說就是在使用遠程對象再本地內存的一個引用,,相當于把它當做一個本地對象來使用。。。而最終調用進程不會關心這個對象是否是本地對象,或是遠程對象,,都會被當做本地對象來處理。。。。這里本地對象和遠程對象的引用所表示的和他們之間的不同之處也就是,本地對象表示本地進程地址空間里的一個地址,而遠程對象的引用則是一個32位的句柄。
?
??????????在android中,,我們的activity組件要與service組件進行通信,就需要使用到Binder機制,我們可以把activity看做一個客戶端,把service看做一個服務端,也就是一個客戶端于服務端的通信,。。。android的binder機制就是一個C/S架構,客戶端和服務端直接通過Binder交互數據,打開Binder寫入數據,通過Binder讀取數據,這樣就完成通訊,,數據的讀寫是由Binder driver來完成的。。。。除了driver外,還包括以下組成部分:
1,service Manager 負責管理android系統中的所有服務(android是如何初始化service manager 詳情可見我的上一篇博客),當客戶端要去服務端進行通信時,就會通過它來查詢和取得要交互的service。。
2,server,,服務端,也就是service manager查詢出來的service。。
3,客戶端,,請求service中的服務,也就是當做是activity。。。
4,服務代理,,就是客戶端應用中生成的server代理,,也就是AIDL生成文件中的stub(service proxy),,他包含service的所提供服務的所有方法,所以在應用程序端看來他和service沒有區別。。。.
總結
以上是生活随笔為你收集整理的深入理解 Android 的 IPC 机制--------Binder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Android Studio打And
- 下一篇: Android异步编程