Android為什麼選擇binder
Binder (Android技術內幕):
在上面這些可供選擇的方式中,Android使用得最多也最被認可的還是Binder機制。
為什麼會選擇Binder來作為程式之間的通訊機制呢?因為Binder更加簡潔和快速,消耗的記憶體資源更小嗎?
不錯,這些也正是Binder的優點。
當然,也還有很多其他原因,比如傳統的程式間通訊可能會增加程式的開銷,而且有程式過載和安全漏洞等方面的風險,Binder正好能解決和避免這些問題。
Binder主要能提供以下一些功能:
用驅動程式來推進程式間的通訊。
通過共享記憶體來提高效能。
為程式請求分配每個程式的執行緒池。
針對系統中的物件引入了引用計數和跨程式的物件引用對映。
程式間同步呼叫。
Android Binder設計與實現 – 設計篇:
目前linux支援的IPC包括傳統的管道、System V IPC、即訊息佇列/共享記憶體/訊號量,以及socket中只有socket支援Client-Server的通訊方式。
當然也可以在這些底層機制上架設一套協議來實現Client-Server通訊,但這樣增加了系統的複雜性,在手機這種條件複雜,資源稀缺的環境下可靠性也難以保證。
另一方面是傳輸效能:
socket作為一款通用介面,其傳輸效率低,開銷大,主要用在跨網路的程式間通訊和本機上程式間的低速通訊。
訊息佇列和管道採用儲存-轉發方式,即資料先從傳送方快取區拷貝到核心開闢的快取區中,然後再從核心快取區拷貝到接收方快取區,
至少有兩次拷貝過程。共享記憶體雖然無需拷貝,但控制複雜,難以使用。
表 1 各種IPC方式資料拷貝次數
IPC |
資料拷貝次數 |
共享記憶體 |
0 |
Binder |
1 |
Socket/管道/訊息佇列 |
2 |
還有一點是出於安全性考慮:
Android作為一個開放式,擁有眾多開發者的平臺,應用程式的來源廣泛,確保智慧終端的安全是非常重要的。
終端使用者不希望從網上下載的程式在不知情的情況下偷窺隱私資料,連線無線網路,長期操作底層裝置導致電池很快耗盡等等。傳統IPC沒有任何
安全措施,完全依賴上層協議來確保。首先傳統IPC的接收方無法獲得對方程式可靠的UID/PID(使用者ID/程式ID),從而無法鑑別對方身份。
Android為每個安裝好的應用程式分配了自己的UID,故程式的UID是鑑別程式身份的重要標誌。使用傳統IPC只能由使用者在資料包裡填入UID/PID,
但這樣不可靠,容易被惡意程式利用。可靠的身份標記只有由IPC機制本身在核心中新增。其次傳統IPC訪問接入點是開放的,無法建立私有通道。
比如命名管道的名稱、system V的鍵值、socket的ip地址或檔名都是開放的,只要知道這些接入點的程式都可以和對端建立連線,不管怎樣都無法
阻止惡意程式通過猜測接收方地址獲得連線。
基於以上原因,Android需要建立一套新的IPC機制來滿足系統對通訊方式,傳輸效能和安全性的要求,這就是Binder。
Binder基於 Client-Server通訊模式,傳輸過程只需一次拷貝,為傳送發新增UID/PID身份,既支援實名Binder也支援匿名Binder,安全性高。
物件導向的 Binder IPC:
物件導向思想的引入將程式間通訊轉化為通過對某個Binder物件的引用呼叫該物件的方法,而其獨特之處在於Binder物件是一個
可以跨程式引用的物件,它的實體位於一個程式中,而它的引用卻遍佈於系統的各個程式之中。最誘人的是,這個引用和java裡引用
一樣既可以是強型別,也可以是弱型別,而且可以從一個程式傳給其它程式,讓大家都能訪問同一Server,就像將一個物件或引用賦
值給另一個引用一樣。Binder模糊了程式邊界,淡化了程式間通訊過程,整個系統彷彿執行於同一個物件導向的程式之中。
物件導向只是針對應用程式而言,對於Binder驅動和核心其它模組一樣使用C語言實現,沒有類和物件的概念。
Binder驅動為物件導向的程式間通訊提供底層支援。
》關於Binder架構:
從架構的角度看,在Java中搭建了一整套框架,如IBinder介面、Binder類和BinderProxy類。但是從通訊角度看,架構的編寫不論採用的是Native語言還是Java語言,只要把請求傳遞到Binder驅動就可以了,所以通訊的目的是向binder傳送請求和接收回復。在這個目的之上,考慮到軟體的靈活性和可擴充套件性,於是編寫了一個架構。反過來說,也可以不使用架構(即沒有使用任何介面、派生之類的東西)而直接和binder互動,例如,ServiceManager作為Binder架構的一個核心程式,就是直接讀取/dev/binder裝置,獲取並處理請求。從這一點上看,Binder架構的目的雖是簡單的(即開啟binder裝置,然後讀請求和寫回復),但是架構是複雜的(編寫各種介面類和封裝類等)。我們在研究原始碼時,一定要先搞清楚目的。實現只不過是達到該目的的一種手段和方式。脫離目的而去研究實現,如緣木求魚,很容易偏離事物本質。
來自:http://wenku.baidu.com/view/4186490690c69ec3d5bb753a.html
相關文章
- 為什麼選擇Guice框架GUI框架
- Aembit為什麼選擇 Rust?Rust
- 為什麼選擇使用Rust?Rust
- 為什麼要選擇SQL?SQL
- 為什麼選擇.NETCore?NetCore
- 為什麼選擇centos系統CentOS
- 為什麼選擇高防DNS?DNS
- 為什麼選擇Cynefin框架? – zwischenzugs框架
- (轉)為什麼選擇機器學習策略機器學習
- 我為什麼選擇 Angular 2?Angular
- 為什麼選擇Twitter Storm?薦ORM
- 為什麼選擇ASP.NET CoreASP.NET
- 老闆:你為什麼要選擇 Vue?Vue
- 為什麼選擇PostgreSQL而不是MySQLMySql
- 我為什麼選擇成為獨立開發者
- 為什麼建議新手選擇Ubuntu?告訴你選擇理由!Ubuntu
- 為什麼選擇獨立伺服器伺服器
- 為什麼選擇學習六西格瑪?
- 為什麼爬蟲要選擇住宅代理?爬蟲
- 為什麼選擇無伺服器模型?伺服器模型
- 為什麼選擇Python做爬蟲Python爬蟲
- 為什麼GitLab選擇Vue.js?GitlabVue.js
- 我為什麼選擇了 AdonisJsJS
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- 如何選擇版本控制系統——為什麼選擇Git版本控制系統Git
- 為什麼要選擇蘋果企業簽名?蘋果
- 為什麼機器學習會選擇Python語言?機器學習Python
- 為什麼要選擇分散式資料庫?分散式資料庫
- 為什麼要選擇電話機器人?機器人
- 我為什麼放棄MySQL?選擇了MongoDBMySqlMongoDB
- 為什麼選擇高防DNS雲解析?(一)DNS
- 為什麼要選擇代理來進行抓取?
- 為什麼選擇Java?Java具體好在哪?Java
- 即時通訊系統為什麼選擇GaussDB(for Redis)?Redis
- Java夜校班好嗎?為什麼選擇他Java
- 男性遊戲玩家為什麼愛選擇女性角色?遊戲
- 為什麼不上架,選擇企業簽名?
- 為什麼我會選擇走 Java 這條路?Java