真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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)同步一站式服務解決您的所有建站問題。

目錄

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


  1. Binder到底是什么?

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

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

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

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

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

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

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

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

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


2. 知識儲備

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

2.1 進程空間分配

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

  • 二者區(qū)別:

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

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

  • 進程內 用戶 與 內核 進行交互 稱為系統(tǒng)調用

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

2.2 進程隔離

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

2.3 跨進程通信(  IPC

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

  • 跨進程間通信的原理

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

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

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

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


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

3.1 模型原理

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

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

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

3.2 額外說明

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

原因:

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

  2. Binder驅動 屬于 進程空間的 內核空間,可進行進程間 & 進程內交互

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

虛線表示并非直接交互

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

說明2:  
Binder驅動 & Service Manager進程 屬于 Android基礎架構(即系統(tǒng)已經(jīng)實現(xiàn)好了);而Client 進程 和 Server 進程 屬于Android應用層(需要開發(fā)者自己實現(xiàn))

所以,在進行跨進程通信時,開發(fā)者只需自定義Client  &  Server 進程 并 顯式使用上述3個步驟,最終借助 Android的基本架構功能就可完成進程間通信

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

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



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

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

    下面會詳細說明

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

    即:

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

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

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

步驟1:注冊服務

  • 過程描述
    Server進程 通過Binder驅動 向  Service Manager進程 注冊服務

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

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

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

    3. Binder 驅動通過 內核空間的Binder 實體 找到用戶空間的Server對象

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

步驟2:獲取服務

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

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

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

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

步驟3:使用服務

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

  • 過程描述

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

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

    3. Server進程 將目標方法的結果(即加法后的結果)返回給Client進程

  • 代碼實現(xiàn)過程

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

步驟2:Server進程根據(jù)Client進要求 調用 目標方法(即加法函數(shù))

步驟3:Server進程 將目標方法的結果(即加法后的結果)返回給Client進程

  • 總結
    下面,我用一個原理圖 & 流程圖來總結步驟3的內容

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

原理圖

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


5. 優(yōu)點

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

  • 高效

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

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

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

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

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

  • 使用簡單

    1. 采用Client/Server 架構

    2. 實現(xiàn) 面向對象的調用方式,即在使用Binder時就和調用一個本地對象實例一樣


6. 總結

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

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

定義

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


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


新聞標題:Android中怎么利用Binder實現(xiàn)跨進程通信
分享地址:http://weahome.cn/article/ishdoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部