Android Binder总结
從前面的博客中我們已經(jīng)學(xué)習(xí)到如何使用binder,也學(xué)習(xí)到binder的框架及原理。今天就聊聊我對(duì)android為什么使用binder作為最重要的IPC機(jī)制這個(gè)問題的想法,并總結(jié)一下先前的android binder相關(guān)博客。
binder其實(shí)不是android首先提出來的IPC機(jī)制,它是基于OpenBinder來實(shí)現(xiàn)的。OpenBinder有許可問題,andriod不能直接使用,故此重新開發(fā)了自己的一套binder實(shí)現(xiàn),基于寬松的Apache協(xié)議發(fā)布,架構(gòu)與OpenBinder類似,相關(guān)信息可以參考:?http://www.open-binder.org。
Android為什么選用Binder作為最重要的IPC機(jī)制
我們知道在Linux系統(tǒng)中,進(jìn)程間的通信方式有socket,named pipe,message queue,signal,sharememory等。這幾種通信方式的優(yōu)缺點(diǎn)如下:
- 1) named pipe: 任何進(jìn)程都能通訊,但速度慢
- 2) message queue: 容量受到系統(tǒng)限制,且要注意第一次讀的時(shí)候,要考慮上一次沒有讀完數(shù)據(jù)的問題
- 3) signal: 不能傳遞復(fù)雜消息,只能用來同步
- 4) shared memory: 能夠很容易控制容量,速度快,但要保持同步,比如一個(gè)進(jìn)程在寫的時(shí)候,另一個(gè)進(jìn)程要注意讀寫的問題,相當(dāng)于線程中的線程安全,當(dāng)然,共享內(nèi)存同樣可以作為線程通訊,不過沒這個(gè)必要,線程間本來就已經(jīng)共享了同一進(jìn)程內(nèi)的一塊內(nèi)存。
- 5) socket:本機(jī)進(jìn)程之間可以利用socket通信,跨主機(jī)之間也可利用socket通信,通常rpc的實(shí)現(xiàn)最底層都是通過socket通信。socket通信是一種比較復(fù)雜的通信方式,通常客戶端需要開啟單獨(dú)的監(jiān)聽線程來接收從服務(wù)端發(fā)送過來的數(shù)據(jù),客戶端線程發(fā)送數(shù)據(jù)給服務(wù)端后,如果需要等待服務(wù)端的響應(yīng),并通過監(jiān)聽線程接收數(shù)據(jù),需要進(jìn)行同步,是一件很麻煩的事情。socket通信速度也不快。
Android中屬性服務(wù)的實(shí)現(xiàn)和vold服務(wù)的實(shí)現(xiàn)采用了socket,getprop和setprop等命令都是通過socket和init進(jìn)程通信來獲得屬性或者設(shè)置屬性,vdc命令和mount service也是通過socket和vold服務(wù)通信來操作外接設(shè)備,比如sd卡。
message queue允許任意進(jìn)程共享消息隊(duì)列實(shí)現(xiàn)進(jìn)程間通信,并由內(nèi)核負(fù)責(zé)消息發(fā)送和接收之間的同步,從而使得用戶在使用消息隊(duì)列進(jìn)行通信時(shí)不再需要考慮同步問題。這樣使用方便,但是信息的復(fù)制需要額外消耗CPU時(shí)間,不適合信息量大或者操作頻繁的場(chǎng)合。共享內(nèi)存針對(duì)消息緩沖的缺點(diǎn)改而利用內(nèi)存緩沖區(qū)直接交換信息,無須復(fù)制,快速,信息量大是其優(yōu)點(diǎn)。
共享內(nèi)存塊提供了在任意數(shù)量的進(jìn)程之間進(jìn)行高效雙向通信的機(jī)制,每個(gè)使用者都可以讀取寫入數(shù)據(jù),但是所有程序之間必須達(dá)成并遵守一定的協(xié)議,以防止諸如在讀取信息之前覆蓋內(nèi)存空間等競(jìng)爭(zhēng)狀態(tài)的實(shí)現(xiàn)。不幸的是,Linux無法嚴(yán)格保證對(duì)內(nèi)存塊的獨(dú)占訪問,甚至是您通過使用IPC_PRIVATE創(chuàng)建新的共享內(nèi)存塊的時(shí)候,也不能保證訪問的獨(dú)占性。同時(shí),多個(gè)使用共享內(nèi)存塊的進(jìn)程之間必須協(xié)調(diào)使用同一個(gè)鍵值。
Android應(yīng)用程序開發(fā)者開發(fā)應(yīng)用程序時(shí),對(duì)系統(tǒng)框架的進(jìn)程和線程運(yùn)作機(jī)制不必了解,只需要利用四大組件開發(fā),Android應(yīng)用開發(fā)時(shí)可以輕易調(diào)用別的軟件提供的功能,甚至可以調(diào)用系統(tǒng)App,在Android的世界里,所有應(yīng)用生而平等,但實(shí)質(zhì)上應(yīng)用進(jìn)程被隔離在不同的沙盒里。
Android平臺(tái)的進(jìn)程之間需要頻繁的通信,比如打開一個(gè)應(yīng)用便需要Home應(yīng)用程序進(jìn)程和運(yùn)行在system_server進(jìn)程里的AcitivityManagerService通信才能打開。正是由于Android平臺(tái)的進(jìn)程需要非常頻繁的通信,故此對(duì)進(jìn)程間通信機(jī)制要求比較高,速度要快,還要能進(jìn)行復(fù)雜數(shù)據(jù)的交換,應(yīng)用開發(fā)時(shí)應(yīng)盡可能簡(jiǎn)單,并能提供同步調(diào)用。雖然共享內(nèi)存的效率高,但是它需要復(fù)雜的同步機(jī)制,使用時(shí)很麻煩,故此不能采用。binder能滿足這些要求,所以Android選擇了binder作為最核心的進(jìn)程間通信方式。binder主要提供以下一些功能:
- 1) 用驅(qū)動(dòng)程序來推進(jìn)進(jìn)程間的通信方式
- 2) 通過共享內(nèi)存來提高性能
- 3) 為進(jìn)程請(qǐng)求分配每個(gè)進(jìn)程的線程池,每個(gè)應(yīng)用進(jìn)程默認(rèn)啟動(dòng)兩個(gè)binder服務(wù)線程
- 4) 針對(duì)系統(tǒng)中的對(duì)象引入了引用技術(shù)和跨進(jìn)程的對(duì)象引用映射
- 5) 進(jìn)程間同步調(diào)用。
Binder入門和詳解系列博客匯總
《service manager和binder service的關(guān)系》
http://www.cloudchou.com/android/post-327.html
闡述了servicemanager和binder service的關(guān)系,并說明了servicemananger,binder service的服務(wù)端,客戶端程序運(yùn)行時(shí)各自所在進(jìn)程
《Binder service入門–創(chuàng)建native binder service》
http://www.cloudchou.com/android/post-332.html
用實(shí)例說明如何創(chuàng)建native binder service的服務(wù)端和客戶端,并說明了如何編譯以及運(yùn)行程序,代碼在github上可下載。
《Binder service入門—Framework binder service》
http://www.cloudchou.com/android/post-447.html
用實(shí)例說明如何創(chuàng)建framework層 binder service的服務(wù)端和客戶端,并說明了如何編譯以及運(yùn)行程序,代碼在github上可下載
《Binder service入門—應(yīng)用層binder service》
http://www.cloudchou.com/android/post-458.html
用實(shí)例說明如何創(chuàng)建應(yīng)用層binder service的服務(wù)端和客戶端,并說明了如何編譯以及運(yùn)行程序,代碼在github上可下載
《Binder service入門—框架層、應(yīng)用層調(diào)用native binder service》
http://www.cloudchou.com/android/post-468.html
綜合運(yùn)用了前面幾篇博客的知識(shí),用實(shí)例說明了如何在框架層,應(yīng)用層調(diào)用native binder service,所有代碼均可在github上下載
《Binder 機(jī)制詳解—Binder IPC 程序結(jié)構(gòu)》
http://www.cloudchou.com/android/post-497.html
從本篇博客開始分析binder機(jī)制,簡(jiǎn)單介紹了binder機(jī)制運(yùn)行時(shí)服務(wù)端,客戶端和servicemananger的關(guān)系
《Binder 機(jī)制詳解—Binder 系統(tǒng)架構(gòu)》
http://www.cloudchou.com/android/post-507.html
分析了Binder系統(tǒng)架構(gòu),層次劃分,并著重分析了Binder Adaper層和Binder的核心部分
《本地Binder框架通信原理》
http://www.cloudchou.com/android/post-534.html
分析了binder本地框架通信原理,主要就兩個(gè)重要函數(shù)調(diào)用流程進(jìn)行分析,分析了如何獲得servicemananger的IBinder指針,還分析了客戶端如何獲得IBinder指針
《Binder 機(jī)制詳解—Binder 本地框架》
http://www.cloudchou.com/android/post-547.html
分析了Binder本地框架各個(gè)類之間的關(guān)系,以及IServiceManager相關(guān)類之間的關(guān)系
《Binder 機(jī)制詳解—Binder Java框架》
http://www.cloudchou.com/android/post-558.html
分析了Binder Java框架各個(gè)類之間的關(guān)系,并分析了Binder java框架的相關(guān)Jni源碼,給出了Java層Binder,BinderProxy,Parcel和本地的BnBinder,BpBinder,Parcel之間的關(guān)系。
《Java層Binder框架通信原理》
http://www.cloudchou.com/android/post-573.html
分析了Java層Binder框架通信原理,主要分析了Java層如何獲得IServiceManager對(duì)象,和Java層如何獲得IBinder接口對(duì)象,還分析了Java層binder的數(shù)據(jù)流動(dòng)
參考資料
《Android技術(shù)內(nèi)幕—系統(tǒng)卷》 第3章 Android的IPC機(jī)制—Binder
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Android Binder总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android实现点击通知栏后,先启动应
- 下一篇: Android Studio系列(二)使