溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中怎么利用Binder實現(xiàn)跨進程通信

發(fā)布時間:2021-06-26 14:37:26 來源:億速云 閱讀:537 作者:Leah 欄目:大數(shù)據(jù)

Android中怎么利用Binder實現(xiàn)跨進程通信,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

目錄

Android中怎么利用Binder實現(xiàn)跨進程通信


  1. Binder到底是什么?

  • 中文即 粘合劑,意思為粘合了兩個不同的進程

  • 網(wǎng)上有很多對Binder的定義,但都說不清楚:Binder是跨進程通信方式、它實現(xiàn)了IBinder接口,是連接 ServiceManager的橋梁blabla,估計大家都看暈了,沒法很好的理解

  • 我認為:對于Binder的定義,在不同場景下其定義不同

Android中怎么利用Binder實現(xiàn)跨進程通信

在本文的講解中,按照 大角度 -> 小角度 去分析Binder,即:

  • 先從 機制、模型的角度 去分析 整個Binder跨進程通信機制的模型

    其中,會詳細分析模型組成中的 Binder驅(qū)動

  • 再 從源碼實現(xiàn)角度,分析 BinderAndroid中的具體實現(xiàn)

從而全方位地介紹 Binder,希望你們會喜歡。


2. 知識儲備

在講解Binder前,我們先了解一些基礎(chǔ)知識

2.1 進程空間分配

  • 一個進程空間分為 用戶空間 & 內(nèi)核空間(Kernel),即把進程內(nèi) 用戶 & 內(nèi)核 隔離開來

  • 二者區(qū)別:

    1. 進程間,用戶空間的數(shù)據(jù)不可共享,所以用戶空間 = 不可共享空間

    2. 進程間,內(nèi)核空間的數(shù)據(jù)可共享,所以內(nèi)核空間 = 可共享空間

  • 進程內(nèi) 用戶 與 內(nèi)核 進行交互 稱為系統(tǒng)調(diào)用


Android中怎么利用Binder實現(xiàn)跨進程通信

2.2 進程隔離

為了保證 安全性 & 獨立性,一個進程 不能直接操作或者訪問另一個進程,即Android的進程是相互獨立、隔離的

2.3 跨進程通信(  IPC

  • 隔離后,由于某些需求,進程間 需要合作 / 交互

  • 跨進程間通信的原理

    1. 先通過 進程間 的內(nèi)核空間進行 數(shù)據(jù)交互

    2. 再通過 進程內(nèi) 的用戶空間 & 內(nèi)核空間進行 數(shù)據(jù)交互,從而實現(xiàn) 進程間的用戶空間 的數(shù)據(jù)交互


Android中怎么利用Binder實現(xiàn)跨進程通信

Binder,就是充當 連接 兩個進程(內(nèi)核空間)的通道。


3. Binder 跨進程通信機制 模型

3.1 模型原理

Binder 跨進程通信機制 模型 基于 Client - Server 模式,模型原理圖如下:

相信我,一張圖就能解決問題

Android中怎么利用Binder實現(xiàn)跨進程通信

3.2 額外說明

說明1:Client進程、Server進程 & Service Manager 進程之間的交互都必須通過Binder驅(qū)動(使用 openioctl文件操作函數(shù)),而非直接交互 **

原因:

  1. Client進程、Server進程 & Service Manager進程屬于進程空間的用戶空間,不可進行進程間交互

  2. Binder驅(qū)動 屬于 進程空間的 內(nèi)核空間,可進行進程間 & 進程內(nèi)交互


所以,原理圖可表示為以下:

虛線表示并非直接交互

Android中怎么利用Binder實現(xiàn)跨進程通信

說明2:  
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)功能就可完成進程間通信

Android中怎么利用Binder實現(xiàn)跨進程通信

說明3:Binder請求的線程管理
  • 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)的





4. Binder機制 在Android中的具體實現(xiàn)原理

  • Binder機制在 Android中的實現(xiàn)主要依靠 Binder類,其實現(xiàn)了IBinder 接口

    下面會詳細說明

  • 實例說明:Client進程 需要調(diào)用 Server進程的加法函數(shù)(將整數(shù)a和b相加)

    即:

    1. Client進程 需要傳兩個整數(shù)給 Server進程

    2. Server進程 需要把相加后的結(jié)果 返回給Client進程


  • 具體步驟
    下面,我會根據(jù)Binder 跨進程通信機制 模型的步驟進行分析

步驟1:注冊服務(wù)

  • 過程描述
    Server進程 通過Binder驅(qū)動 向  Service Manager進程 注冊服務(wù)

  • 代碼實現(xiàn)
    Server進程 創(chuàng)建 一個 Binder 對象

    1. Binder 實體是 Server進程 在 Binder 驅(qū)動中的存在形式

    2. 該對象保存 ServerServiceManager 的信息(保存在內(nèi)核空間中)

    3. Binder 驅(qū)動通過 內(nèi)核空間的Binder 實體 找到用戶空間的Server對象


注冊服務(wù)后,Binder驅(qū)動持有 Server進程創(chuàng)建的Binder實體

步驟2:獲取服務(wù)

  • Client進程 使用 某個 service前(此處是 相加函數(shù)),須 通過Binder驅(qū)動 向 ServiceManager進程 獲取相應(yīng)的Service信息

  • 具體代碼實現(xiàn)過程如下:

Android中怎么利用Binder實現(xiàn)跨進程通信

此時,Client進程與 Server進程已經(jīng)建立了連接

步驟3:使用服務(wù)

Client進程 根據(jù)獲取到的 Service信息(Binder代理對象),通過Binder驅(qū)動 建立與 該Service所在Server進程通信的鏈路,并開始使用服務(wù)

  • 過程描述

    1. Client進程 將參數(shù)(整數(shù)a和b)發(fā)送到Server進程

    2. Server進程 根據(jù)Client進程要求調(diào)用 目標方法(即加法函數(shù))

    3. 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)容

Android中怎么利用Binder實現(xiàn)跨進程通信

原理圖

Android中怎么利用Binder實現(xiàn)跨進程通信


5. 優(yōu)點

對比 LinuxAndroid基于Linux)上的其他進程通信方式(管道/消息隊列/共享內(nèi)存/信號量/Socket),Binder 機制的優(yōu)點有:

  • 高效

    1. Binder數(shù)據(jù)拷貝只需要一次,而管道、消息隊列、Socket都需要2次

    2. 通過驅(qū)動在內(nèi)核空間拷貝數(shù)據(jù),不需要額外的同步處理

  • 安全性高
    Binder 機制為每個進程分配了 UID/PID 來作為鑒別身份的標示,并且在 Binder 通信時會根據(jù) UID/PID 進行有效性檢測

    1. 傳統(tǒng)的進程通信方式對于通信雙方的身份并沒有做出嚴格的驗證

    2. 如,Socket通信 ip地址是客戶端手動填入,容易出現(xiàn)偽造

  • 使用簡單

    1. 采用Client/Server 架構(gòu)

    2. 實現(xiàn) 面向?qū)ο?/strong> 的調(diào)用方式,即在使用Binder時就和調(diào)用一個本地對象實例一樣


6. 總結(jié)

  • 本文主要詳細講解 跨進程通信模型 Binder機制 ,總結(jié)如下:

Android中怎么利用Binder實現(xiàn)跨進程通信

定義

Android中怎么利用Binder實現(xiàn)跨進程通信


看完上述內(nèi)容,你們掌握Android中怎么利用Binder實現(xiàn)跨進程通信的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI