TShopping

 找回密碼
 註冊
搜索
查看: 2127|回復: 0
打印 上一主題 下一主題

[教學] Android Binder總結

[複製鏈接]
跳轉到指定樓層
1#
發表於 2014-12-9 23:25:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
本文原創作者: 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等。這幾種通信方式的優缺點如下:

  • 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



 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-24 19:17 , Processed in 0.058551 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表