Android Binder总结
從前面的博客中我們已經學習到如何使用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等。這幾種通信方式的優缺點如下:
- 1) named pipe: 任何進程都能通訊,但速度慢
- 2) message queue: 容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
- 3) signal: 不能傳遞復雜消息,只能用來同步
- 4) shared memory: 能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當于線程中的線程安全,當然,共享內存同樣可以作為線程通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存。
- 5) socket:本機進程之間可以利用socket通信,跨主機之間也可利用socket通信,通常rpc的實現最底層都是通過socket通信。socket通信是一種比較復雜的通信方式,通常客戶端需要開啟單獨的監聽線程來接收從服務端發送過來的數據,客戶端線程發送數據給服務端后,如果需要等待服務端的響應,并通過監聽線程接收數據,需要進行同步,是一件很麻煩的事情。socket通信速度也不快。
Android中屬性服務的實現和vold服務的實現采用了socket,getprop和setprop等命令都是通過socket和init進程通信來獲得屬性或者設置屬性,vdc命令和mount service也是通過socket和vold服務通信來操作外接設備,比如sd卡。
message queue允許任意進程共享消息隊列實現進程間通信,并由內核負責消息發送和接收之間的同步,從而使得用戶在使用消息隊列進行通信時不再需要考慮同步問題。這樣使用方便,但是信息的復制需要額外消耗CPU時間,不適合信息量大或者操作頻繁的場合。共享內存針對消息緩沖的缺點改而利用內存緩沖區直接交換信息,無須復制,快速,信息量大是其優點。
共享內存塊提供了在任意數量的進程之間進行高效雙向通信的機制,每個使用者都可以讀取寫入數據,但是所有程序之間必須達成并遵守一定的協議,以防止諸如在讀取信息之前覆蓋內存空間等競爭狀態的實現。不幸的是,Linux無法嚴格保證對內存塊的獨占訪問,甚至是您通過使用IPC_PRIVATE創建新的共享內存塊的時候,也不能保證訪問的獨占性。同時,多個使用共享內存塊的進程之間必須協調使用同一個鍵值。
Android應用程序開發者開發應用程序時,對系統框架的進程和線程運作機制不必了解,只需要利用四大組件開發,Android應用開發時可以輕易調用別的軟件提供的功能,甚至可以調用系統App,在Android的世界里,所有應用生而平等,但實質上應用進程被隔離在不同的沙盒里。
Android平臺的進程之間需要頻繁的通信,比如打開一個應用便需要Home應用程序進程和運行在system_server進程里的AcitivityManagerService通信才能打開。正是由于Android平臺的進程需要非常頻繁的通信,故此對進程間通信機制要求比較高,速度要快,還要能進行復雜數據的交換,應用開發時應盡可能簡單,并能提供同步調用。雖然共享內存的效率高,但是它需要復雜的同步機制,使用時很麻煩,故此不能采用。binder能滿足這些要求,所以Android選擇了binder作為最核心的進程間通信方式。binder主要提供以下一些功能:
- 1) 用驅動程序來推進進程間的通信方式
- 2) 通過共享內存來提高性能
- 3) 為進程請求分配每個進程的線程池,每個應用進程默認啟動兩個binder服務線程
- 4) 針對系統中的對象引入了引用技術和跨進程的對象引用映射
- 5) 進程間同步調用。
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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Android Binder总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android实现点击通知栏后,先启动应
- 下一篇: Android Studio系列(二)使