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