TShopping

標題: Android Binder總結 [打印本頁]

作者: woff    時間: 2014-12-9 23:25
標題: Android Binder總結
本文原創作者: Cloud Chou.歡迎轉載,請註明出處和本文鏈接

從前面的博客中我們已經學習到如何使用binder,也學習到binder的框架及原理。今天就聊聊我對android為什麼使用binder作為最重要的IPC機制這個問題的想法,並總結一下先前的android binder相關博客。

binder其實不是android首先提出來的IPC機制,它是基於OpenBinder來實現的。OpenBinder有許可問題,andriod不能直接使用,故此重新開發了自己的一套binder實現,基於寬鬆的Apache協議發布,架構與OpenBinder類似,相關信息可以參考: http://www.open-binder.org

Android為什麼選用Binder作為最重要的IPC機制

我們知道在Linux系統中,進程間的通信方式有socket,named pipe,message queue,signal,sharememory等。這幾種通信方式的優缺點如下:

message queue允許任意進程通過共享消息隊列來實現進程間通信,並由系統調用函數來實現消息發送和接收之間的同步,從而使得用戶在使用消息緩衝進行通信時不再需要考慮同步問題。使用方便,但是信息的複制需要額外消耗CPU的時間,不適宜於信息量大或者操作頻繁的場合。共享內存針對消息緩衝的缺點改而利用內存緩衝區直接交換信息,無須複製,快速,信息量大是其優點。但是共享內存的通信方式是通過將共享的緩衝區直接加到進程的虛擬地址空間中來實現的。因此這些進程之間的讀寫操作的同步問題操作系統無法實現。必須由進程利用其它同步工具解決。另外由於內存實體存在於計算機系統中,所以只能由處於同一個計算機系統的進程共享。不方便網絡通信。

共享內存塊提供了在任意數量的進程之間進行高效雙向通信的機制,每個使用者都可以讀取寫入數據,但是所有程序之間必須達成並遵守一定的協議,以防止諸如在讀取信息之前覆蓋內存空間等競爭狀態的實現。不幸的是,Linux無法嚴格保證對內存塊的獨占訪問,甚至是您通過使用IPC_PRIVATE創建新的共享內存塊的時候,也不能保證訪問的獨占性。同時,多個使用共享內存塊的進程之間必須協調使用同一個鍵值。

Android應用程序開發者開發應用程序時,對系統框架的進程和線程運作機制不必了解,只需要利用四大組件開發,Android應用開發時可以輕易調用別的軟件提供的功能,甚至可以調用系統App,在Android的世界裡,所有應用生而平等,但實質上應用進程被隔離在不同的沙盒裡。

Android平台的進程之間需要頻繁的通信,比如打開一個應用便需要Home應用程序進程和運行在system_server進程裡的AcitivityManagerService通信才能打開。正是由於Android平台的進程需要非常頻繁的通信,故此對進程間通信機制要求比較高,速度要快,還要能進行複雜數據的交換,應用開發時應盡可能簡單,並能提供同步調用。雖然共享內存的效率高,但是它需要復雜的同步機制,使用時很麻煩,故此不能採用。binder能滿足這些要求,所以Android選擇了binder作為最核心的進程間通信方式。binder主要提供以下一些功能:

Binder入門和詳解系列博客匯總

《service manager和binder service的關係》

http://www.cloudchou.com/android/post-327.html

闡述了servicemanager和binder service的關係,並說明了servicemananger,binder service的服務端,客戶端程序運行時各自所在進程

《Binder service入門–創建native binder service》

http://www.cloudchou.com/android/post-332.html

用實例說明如何創建native binder service的服務端和客戶端,並說明瞭如何編譯以及運行程序,代碼在github上可下載。

《Binder service入門—Framework binder service》

http://www.cloudchou.com/android/post-447.html

用實例說明如何創建framework層binder service的服務端和客戶端,並說明瞭如何編譯以及運行程序,代碼在github上可下載

《Binder service入門—應用層binder service》

http://www.cloudchou.com/android/post-458.html

用實例說明如何創建應用層binder service的服務端和客戶端,並說明瞭如何編譯以及運行程序,代碼在github上可下載

《Binder service入門—框架層、應用層調用native binder service》

http://www.cloudchou.com/android/post-468.html

綜合運用了前面幾篇博客的知識,用實例說明瞭如何在框架層,應用層調用native binder service,所有代碼均可在github上下載

《Binder 機制詳解—Binder IPC 程序結構》

http://www.cloudchou.com/android/post-497.html

從本篇博客開始分析binder機制,簡單介紹了binder機制運行時服務端,客戶端和servicemananger的關係

《Binder 機制詳解—Binder 系統架構》

http://www.cloudchou.com/android/post-507.html

分析了Binder系統架構,層次劃分,並著重分析了Binder Adaper層和Binder的核心部分

《本地Binder框​​架通信原理》

http://www.cloudchou.com/android/post-534.html

分析了binder本地框架通信原理,主要就兩個重要函數調用流程進行分析,分析瞭如何獲得servicemananger的IBinder指針,還分析了客戶端如何獲得IBinder指針

《Binder 機制詳解—Binder 本地框架》

http://www.cloudchou.com/android/post-547.html

分析了Binder本地框架各個類之間的關係,以及IServiceManager相關類之間的關係

《Binder 機制詳解—Binder Java框架》

http://www.cloudchou.com/android/post-558.html

分析了Binder Java框架各個類之間的關係,並分析了Binder java框架的相關Jni源碼,給出了Java層Binder,BinderProxy,Parcel和本地的BnBinder,BpBinder,Parcel之間的關係。

《Java層Binder框​​架通信原理》

http://www.cloudchou.com/android/post-573.html

分析了Java層Binder框​​架通信原理,主要分析了Java層如何獲得IServiceManager對象,和Java層如何獲得IBinder接口對象,還分析了Java層binder的數據流動

參考資料

《Android技術內幕—系統卷》 第3章Android的IPC機制—Binder







歡迎光臨 TShopping (http://www.tshopping.com.tw/) Powered by Discuz! X3.2