1. 程式人生 > 實用技巧 >Android Binder機制初識(一)

Android Binder機制初識(一)

程序間通訊(IPC)

程序空間劃分

  • 在Linux中,一個程序空間可以分為 使用者空間(User space) & 核心空間(Kernel space),即把程序內 使用者 & 核心 隔離開來;
  • 使用者空間中的資料不可共享,核心空間中的資料可共享,這樣做的目的在於保證核心的安全;
  • 程序內 使用者 與 核心 進行互動 稱為系統呼叫
    程序結構圖

程序隔離與通訊

  • 程序間通訊(inter-Process Communication, IPC),是指兩個程序之間進行資料交換的過程。而在Linux系統中為了保證 安全性 & 獨立性,一個程序不能直接操作或者訪問另一個程序,即Android的程序是相互獨立、隔離的。
  • 隔離後,由於某些需求,程序間 需要合作 / 互動,主要分為兩步:1. 先通過程序間的核心空間進行 資料互動; 2. 再通過 程序內 的使用者空間 & 核心空間進行 資料互動,從而實現 程序間的使用者空間 的資料互動。
    在這裡插入圖片描述
  • 而上面的兩個程序間通訊 實質上是在核心區間中分配記憶體並開闢一塊核心快取區,通過copy_from_user函式將資料拷貝到到核心空間的緩衝區中,然後呼叫 copy_to_user() 函式將資料從核心快取區拷貝到接收程序。但這種IPC機制需要傳遞兩次資料,且傳遞資料儲存空間浪費,效率較為低下。

Binder機制

基於記憶體對映的Binder機制的出現解決了這個問題,使得程序間通訊效率大為提升。

  • Binder 只需要拷貝一次資料,而一般的IPC需要拷貝兩次;
  • 通過驅動核心空間拷貝資料,不需要額外的同步處理;
  • 不會因為不知道資料的大小而浪費空間或者時間,效率更高。

在這裡插入圖片描述

Binder機制模型

Binder 跨程序通訊機制 模型 基於 Client - Server 模式,模型原理圖如下:

  • Client程序: Android客戶端,使用服務的程序;
  • Server程序:伺服器端,提供服務的程序;
  • Service Manger程序:中轉站,管理Sevice註冊與查詢;
  • Binder驅動:一種虛擬裝置驅動,連線Server程序、Client程序、ServerManger程序的橋樑,實現程序間資料傳遞與執行緒控制。

在這裡插入圖片描述

註冊服務

Service Manger 註冊 Server程序 資訊

  1. Server程序 向 Binder驅動 發起服務註冊請求;
  2. Binder驅動 將註冊請求轉發給 Service Manger程序;
  3. Service Manger程序 新增該 Server程序。

獲取服務

Client 與 Server建立連線

  1. Client程序 向 Binder驅動發起獲取服務的請求,傳遞要獲取的服務名稱;
  2. Binder驅動將該請求轉發給 Service Manger程序;
  3. Service Manger 查詢需要的Service 對應的伺服器資訊;
  4. 通過Binder驅動將上述服務資訊返回給Client程序。

使用服務

  1. Client程序將引數資料傳送給Server程序:

    1. Client程序將需要傳送的資料放到 Client程序的共享記憶體;
    2. Binder驅動從Client程序的共享記憶體中讀取上述資料,並根據Service Manger 程序裡的Server資訊找到對應的Server程序;
    3. Binder驅動 把上述資料拷貝到Server程序的共享記憶體中,並通知Server程序執行解包。
  2. Server程序根據Client程序要求呼叫目標方法:

    1. 收到Binder驅動驅動通知後,Server程序從執行緒池中取出執行緒,進行資料解包&呼叫目標方法;
    2. 將最終執行結果寫入自己的共享記憶體中。
  3. Server程序將目標方法的結果返回給Client程序

    1. Binder驅動將Server程序的共享記憶體中的資料(目標方法執行結果)拷貝到Client程序的共享記憶體;
    2. 通知Client程序獲得返回結果(此時Client程序之前掛起的執行緒被重新喚醒)。

在這裡插入圖片描述