您好,登錄后才能下訂單哦!
Android中怎么利用Binder實現(xiàn)跨進程通信,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
中文即 粘合劑,意思為粘合了兩個不同的進程
網(wǎng)上有很多對Binder
的定義,但都說不清楚:Binder
是跨進程通信方式、它實現(xiàn)了IBinder
接口,是連接 ServiceManager
的橋梁blabla,估計大家都看暈了,沒法很好的理解
我認為:對于Binder
的定義,在不同場景下其定義不同
在本文的講解中,按照 大角度 -> 小角度 去分析Binder
,即:
先從 機制、模型的角度 去分析 整個Binder
跨進程通信機制的模型
其中,會詳細分析模型組成中的
Binder
驅(qū)動
再 從源碼實現(xiàn)角度,分析 Binder
在 Android
中的具體實現(xiàn)
從而全方位地介紹 Binder
,希望你們會喜歡。
在講解Binder
前,我們先了解一些基礎(chǔ)知識
一個進程空間分為 用戶空間 & 內(nèi)核空間(Kernel
),即把進程內(nèi) 用戶 & 內(nèi)核 隔離開來
二者區(qū)別:
進程間,用戶空間的數(shù)據(jù)不可共享,所以用戶空間 = 不可共享空間
進程間,內(nèi)核空間的數(shù)據(jù)可共享,所以內(nèi)核空間 = 可共享空間
進程內(nèi) 用戶 與 內(nèi)核 進行交互 稱為系統(tǒng)調(diào)用
為了保證 安全性 & 獨立性,一個進程 不能直接操作或者訪問另一個進程,即Android
的進程是相互獨立、隔離的
IPC
)隔離后,由于某些需求,進程間 需要合作 / 交互
跨進程間通信的原理
先通過 進程間 的內(nèi)核空間進行 數(shù)據(jù)交互
再通過 進程內(nèi) 的用戶空間 & 內(nèi)核空間進行 數(shù)據(jù)交互,從而實現(xiàn) 進程間的用戶空間 的數(shù)據(jù)交互
而Binder
,就是充當 連接 兩個進程(內(nèi)核空間)的通道。
Binder
跨進程通信機制 模型 基于 Client - Server
模式,模型原理圖如下:
相信我,一張圖就能解決問題
Client
進程、Server
進程 & Service Manager
進程之間的交互都必須通過Binder
驅(qū)動(使用 open
和 ioctl
文件操作函數(shù)),而非直接交互 **原因:
Client
進程、Server
進程 & Service Manager
進程屬于進程空間的用戶空間,不可進行進程間交互
Binder
驅(qū)動 屬于 進程空間的 內(nèi)核空間,可進行進程間 & 進程內(nèi)交互
所以,原理圖可表示為以下:
虛線表示并非直接交互
Binder
驅(qū)動 & Service Manager
進程 屬于 Android
基礎(chǔ)架構(gòu)(即系統(tǒng)已經(jīng)實現(xiàn)好了);而Client
進程 和 Server
進程 屬于Android
應(yīng)用層(需要開發(fā)者自己實現(xiàn))所以,在進行跨進程通信時,開發(fā)者只需自定義Client
& Server
進程 并 顯式使用上述3個步驟,最終借助 Android
的基本架構(gòu)功能就可完成進程間通信
Server
進程會創(chuàng)建很多線程來處理Binder
請求
管理Binder
模型的線程是采用Binder
驅(qū)動的線程池,并由Binder
驅(qū)動自身進行管理
而不是由
Server
進程來管理的
一個進程的Binder
線程數(shù)默認最大是16,超過的請求會被阻塞等待空閑的Binder線程。
所以,在進程間通信時處理并發(fā)問題時,如使用
ContentProvider
時,它的CRUD
(創(chuàng)建、檢索、更新和刪除)方法只能同時有16個線程同時工作
至此,我相信大家對Binder
跨進程通信機制 模型 已經(jīng)有了一個非常清晰的定性認識
下面,我將通過一個實例,分析Binder
跨進程通信機制 模型在 Android
中的具體代碼實現(xiàn)方式
即分析 上述步驟在
Android
中具體是用代碼如何實現(xiàn)的
Binder
機制在 Android
中的實現(xiàn)主要依靠 Binder
類,其實現(xiàn)了IBinder
接口
下面會詳細說明
實例說明:Client
進程 需要調(diào)用 Server
進程的加法函數(shù)(將整數(shù)a和b相加)
即:
Client
進程 需要傳兩個整數(shù)給 Server
進程
Server
進程 需要把相加后的結(jié)果 返回給Client
進程
具體步驟
下面,我會根據(jù)Binder
跨進程通信機制 模型的步驟進行分析
過程描述Server
進程 通過Binder
驅(qū)動 向 Service Manager
進程 注冊服務(wù)
代碼實現(xiàn)Server
進程 創(chuàng)建 一個 Binder
對象
Binder
實體是 Server
進程 在 Binder
驅(qū)動中的存在形式
該對象保存 Server
和 ServiceManager
的信息(保存在內(nèi)核空間中)
Binder
驅(qū)動通過 內(nèi)核空間的Binder
實體 找到用戶空間的Server
對象
注冊服務(wù)后,Binder
驅(qū)動持有 Server
進程創(chuàng)建的Binder
實體
Client
進程 使用 某個 service
前(此處是 相加函數(shù)),須 通過Binder
驅(qū)動 向 ServiceManager
進程 獲取相應(yīng)的Service
信息
具體代碼實現(xiàn)過程如下:
此時,Client
進程與 Server
進程已經(jīng)建立了連接
Client
進程 根據(jù)獲取到的 Service
信息(Binder
代理對象),通過Binder
驅(qū)動 建立與 該Service
所在Server
進程通信的鏈路,并開始使用服務(wù)
過程描述
Client
進程 將參數(shù)(整數(shù)a和b)發(fā)送到Server
進程
Server
進程 根據(jù)Client
進程要求調(diào)用 目標方法(即加法函數(shù))
Server
進程 將目標方法的結(jié)果(即加法后的結(jié)果)返回給Client
進程
代碼實現(xiàn)過程
步驟1: Client
進程 將參數(shù)(整數(shù)a和b)發(fā)送到Server
進程
步驟2:Server
進程根據(jù)Client
進要求 調(diào)用 目標方法(即加法函數(shù))
步驟3:Server
進程 將目標方法的結(jié)果(即加法后的結(jié)果)返回給Client
進程
總結(jié)
下面,我用一個原理圖 & 流程圖來總結(jié)步驟3的內(nèi)容
原理圖
對比 Linux
(Android
基于Linux
)上的其他進程通信方式(管道/消息隊列/共享內(nèi)存/信號量/Socket),Binder
機制的優(yōu)點有:
高效
Binder
數(shù)據(jù)拷貝只需要一次,而管道、消息隊列、Socket
都需要2次
通過驅(qū)動在內(nèi)核空間拷貝數(shù)據(jù),不需要額外的同步處理
安全性高Binder
機制為每個進程分配了 UID/PID
來作為鑒別身份的標示,并且在 Binder
通信時會根據(jù) UID/PID
進行有效性檢測
傳統(tǒng)的進程通信方式對于通信雙方的身份并沒有做出嚴格的驗證
如,Socket
通信 ip
地址是客戶端手動填入,容易出現(xiàn)偽造
使用簡單
采用Client/Server
架構(gòu)
實現(xiàn) 面向?qū)ο?/strong> 的調(diào)用方式,即在使用Binder
時就和調(diào)用一個本地對象實例一樣
本文主要詳細講解 跨進程通信模型 Binder
機制 ,總結(jié)如下:
定義
看完上述內(nèi)容,你們掌握Android中怎么利用Binder實現(xiàn)跨進程通信的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。