白話Android程序互動之 Binder原理

2021-07-04 13:16:56 字數 1008 閱讀 9462

房子是由一塊塊磚建起來的;而作業系統也一樣,是由乙個個簡單的模組組成。因此對待作業系統的底層原理,我們應該分解開,先看單獨的功能,然後在綜合起來看之間是如何配合的。很幸運的是,系統底層在設計上有很多復用的地方。因此當我們研究完一部分功能以後,再看另一部分,總會有似曾相識的感覺。

在作業系統的實現中,有關程序的問題還真不少。這是因為作業系統是以程序為單位分配資源,又牽扯到程序內的資源保護問題;因此程序之間無法直接聯絡。

這個模型讓我想起了特務機構,特務之間是不認識的。只有一定的級別才可以;因此特務之間的連線都是通過中間人這個角色來實現的。

哈哈,你有沒有發現軟體的設計思想無非是照搬社會上人類已有的東西而已,壓根沒有什麼創新。

現在回歸正題,我們討論binder的原理。

首先,我介紹下,linux要實現程序之間的互動大概有哪些方法。

第一種:對映一塊公有的記憶體,以這塊公有的記憶體為依託來實現資訊互動

第二種:socket,採用socket實現

第三種:管道

第四種:rpc機制

以上四種是最常用的作業系統中用於程序間通訊的原理,其實在系統程式設計中就是四種不同的api而已。

而其中可能要屬記憶體對映速度最快了。

binder原理就是採用記憶體對映的方式來進行跨程序通訊的。

舉個例子:程序a,程序b

程序a通過binder對映一塊記憶體位址a,那麼a和binder各自擁有乙個指標,指向這塊記憶體位址a;現在a和binder都可以訪問到a;

程序b通過binder對映一塊記憶體位址b,程序b和binder各自擁有乙個指向b的指標。現在b和binder都可以訪問到b。

那麼a和b如何互動,那麼很簡單,通過binder這個中間人,比如a想給b傳送資料data,那麼只需要採取如下操作:

準備好資料data–>將data寫入記憶體a–>告訴binder要將data傳送給b–>binder將data從a複製到b–>b讀取b獲取data.資料

就這麼幾步,完成了程序間的通訊。

其實就是通過中間人來進行資訊的傳遞。

Android程序間通訊Binder個人理解記錄

service元件向servicemanager註冊,並實現具體業務,當有client請求時返回乙個可傳輸資料的額ibinder物件實體 client客戶端通過context.bindservice 和servicemanager通訊查詢需要呼叫的服務是否註冊。serviceconnection聯結...

Android利用Binder實現程序通訊

注意 reply.writenoexception 這個方法,服務端如果寫了這個方法,客戶端獲取服務端訊息也必須要寫reply.readexception 這個方法。必須成對出現,否則獲取不到服務端的訊息。public ibinder onbind intent intent class mybin...

原 Android打包之跨平台打包

android自動打包流程詳細圖 在前面一些部落格我們知道了如何通過命令列打包,如何通過eclipse打包,如何通過編寫shell指令碼來進行打包,但是這些都不能很好的跨平台進行打包。因python本身具有很好的跨平台特性,故本博就是通過使用python來進行編寫跨平台打包指令碼,指令碼如下 bui...