關於Binder面試詳解

一、Linux內核的基礎知識

     1.進程隔離/虛擬地址空間

           我們知道在操作系統當中,爲了保護操作系統中的某些進程,互不干擾,它就設計了一個叫進程隔離的技術,而這個技術就是爲了避免進程A可以去操作進程B的數據情況下去實現的.進程的隔離實現,它用到了虛擬地址空間,進程A的虛擬空間和進程B的虛擬空間,其實是不同的,這樣就防止了進程A的數據可以寫到進程B裏面.操作系統當中,不同進程之間和數據是不共享的,所以說對每個進程來說,它其實認爲自己獨享操作系統,其實是虛擬的一個空間而已.如果讓一個進程同另一個進程進行通信,則需要某種進程間的通信機制,才能完成,也就是在安卓裏面Binder通信機制可以完成.

     2.系統調用

         在Linux內核當中,有一個特別重要的概念叫做系統調用,爲什麼會有這個調用呢?因爲我們對內核會有某些保護機制來告訴應用程序你可以訪問某些許可的資源,不許可的資源你是不可以訪問的,這也就是把Linux的內核層和上層應用程序抽象分離開,也就是內核層和用戶空間,我們用戶可以通過系統調用,在用戶空間訪問內核的某些程序

  3.binder驅動

        在安卓系統當中,我們知道它是運行在內核空間的,它負責各個用戶進程通過Binder通信的內核來進行交互的一個模塊,叫做binder驅動.

二、Binder通信機制介紹

     1.爲什麼使用binder

      1)Android使用的Linux內核擁有着非常多的跨進程通訊機制

      2)性能

在移動設備上,廣泛的使用跨進程通信肯定會對通信機制本身提出嚴格的要求,而binder相當於傳統的socket方式,更加的高效

      3)安全

由於傳統的進程間通信,對於通信雙方的身份沒有做出嚴格的驗證,只有上層協議纔會進行架構,就是說我們socket通信的話,IP 地址是客戶端手動填寫的,你可以進行人爲的僞造,binder機制從協議本身就支持通信雙方進行身份校驗,這是binder在安全上所做的努力,在這基礎上,大大提高了安卓程序的安全性.這binder的身份校驗也是安卓的權限模型的基礎.

     2.binder通信模型

我們可以把跨進程通信的雙方,一端稱作服務端進程,而另一段稱爲客戶端進程,而我們知道,由於進程隔離的存在,我們是沒有辦法通過手段在客戶端進程訪問到服務端進程,如果不進行進程間通信的方式的話,舉個栗子:

A同學他要通過通訊錄找B同學,我們知道A同學要給B同學打電話,這裏一定要有B同學的電話號碼,電話號碼怎麼獲取呢?大家都知道電話號碼就是從通訊錄中獲取,而通訊錄都在手機裏,但道理是一樣的,通訊錄中保存了每一個人給他起的編號,綽號還有相對應的電話號碼,這樣A同學通過查找通訊錄中B同學的電話號碼,就可以給B同學打電話了.但是我們知道,僅僅有B同學的通訊錄和電話號碼是沒有辦法進行通訊的,這裏我們還需要一個很基礎但是很容易忘記的概念,就是電話基站的概念,電話基站是可以用來傳遞雙方電話信號的,這樣我們就可以看出一次電話通信的過程,除了通訊的雙方A和B,還有兩個隱藏的,非常重要的角色,就是我們的通訊錄和電話基站,這樣類比到我們Binder通訊模型,其實也是一樣.兩個運行在客戶中間的進程要完成通信,必須藉助與內核的幫助,而這個運行在內核中的程序,叫做Binder驅動,他的功能類似於我們電話基站,而通訊錄叫做ServiceManager,

1)通信錄:binder驅動

2)電話基站 : serviceManager

 3.binder通信機制原理

 

通訊的步驟,第一步:serviceManager的建立,serviceManager相當於通訊錄,所以說,你首先要有一個進程向驅動提出申請爲serviceManager,而那個驅動同意之後,serviceManager負責管理所有的電話號碼,這時候還沒有同學向serviceManager通訊錄中註冊,所以說這時候電話號碼是沒有的.

第二步:A同學想要l聯繫B同學,這時候需要把聯繫方式在serviceManager中註冊,在每個同學進行啓動之後,它就會向serviceManager進行報告,"serviceManager你好,這是我電話號碼,你保存一份,這裏是service1,這裏是內存地址."

第二步的作用就是serviceManager當中建立一個表,對應着各個同學的名字和電話號碼.

第三步:A同學想要和B同學進行通信,首先我會查詢serviceManager,你告訴我service2的聯繫方式,而serviceManager收到查詢的通知之後,serviceManager會返回給這個同學它所查詢的電話號碼,然後這個同學就可以拿到電話號碼去和他所要聯繫的同學進行聯繫.這就是binder通訊模型的三個步驟

那麼binder如何進行跨進程通信的呢?那麼我們來看這麼一張圖:

 

假設我們的client想要調用Server端的返回值是一個object類型的,一個add方法,這其實就是一個跨進程通信的機制

首先,我們的Server它會到serviceManager當中去註冊一個表,這裏它也會告訴serviceManager,我這裏service端有一個object對象,它這裏可以執行一個add的方法操作,於是serviceManager就建立好了一張表,這時候,Client端向serviceManager來查詢,Server端有沒有一個object對象,object對象有沒有一個add方法.我們知道進程間的通信它的數據都是在內核空間裏面,這時候驅動會在數據流的時候做一些手腳,它並不會返回給Client進程一個真正的Server端object對象,因爲這是無法進行操作的,它而是返回object一個代理的對象,而這個代理對象裏面它包含了一個add方法,但是大家要注意的是,這個add方法是一個空方法,什麼都沒有,它沒有做add方法的能力,它唯一要做的就是把這個參數包裝好之後交給驅動來實現,不過這一層對我們Client端其實是透明的,這就是分層協議的好處,它不知道驅動所做的.它只知道它拿到了這個代理對象add方法,它就調用這個add方法,我們知道add方法什麼都不做,調用的時候必然add方法會調用給驅動,這時候驅動收到了client發給它的代理對象的add方法,它一看就明白了,這在我的serviceManager當中有一張表,這個object代理對象它替換了object對象,所以說,我們要訪問的是Server當中的object對象中的add方法,於是binder驅動它就會通知Server端,它會調用它的add方法,然後就把結果返回給驅動,驅動又會返回給client,就這樣驅動作爲client和Server端的一箇中介,進行了進程間通信的一個機制.

給大家總結一句話:客戶端進程只不過是持有了我們的服務端的一個代理,我們通過代理對象協助驅動,去完成了跨進程通信.

大家記住啊,client端只不過是持有了服務端一個代理對象的引用,然後具體的跨進程通信,都是通過代理對象協助完成的.

到底什麼是binder?

1)通常意義,Binder指的是一種通信機制,它是一種跨進程的通訊機制

2)對server進程來說,Binder指的是Binder本地對象/對於Client來說,Binder指的的Binder代理對象

(注:其實客戶端接收的是一個Binder代理對象,它不是真正的服務端對象,服務端對象和客戶端對象其實是無法進行交互的,而只有通過內核層的serviceManager纔可以進行交互)

3)對於傳輸過程而言,Binder是可以進行跨進程傳遞的對象

binder驅動會對具有跨進程傳遞能力的對象做特殊處理,它自動會完成代理對象和服務端對象的轉換

 

三、Aidl的實現

Binder的實例Aidl,我們知道在使用Aidl的時候,編譯工具會給我們生成Stub的靜態內部類,這個Stub的靜態內部類它繼承的是我們自己定義的Aidl,說明它是一個Binder的本地對象,它具有了遠程服務端承諾給我們客戶端數據的能力,而又由於Stub這個抽象類,它是一個抽象的,所以說具體的實現我們要自己來完成,這其實也是Java當中的一個策略模式.

首先我們來看第一個方法asinterface這個方法,我們先看它的參數,它的參數是一個IBinder的參數,IBinder它是一個接口,它代表了跨進程傳輸的能力,只要實現了這個接口,就能將對象跨進程傳遞,它是驅動底層知識的.在跨進程數據傳遞的時候,驅動它會識別onBinder類型的數據,如果是Binder代理對象,那就是Binder的proxy對象.我們來看一下方法的邏輯.

首先,他會進行一個空的判斷.再看第二個if語句,這個if的語句就是如果是同一個進程的話,我就使用,它的iin,如果不是同一個進程的話,我就會使用它的proxy,(代理對象)簡而言之,如果我們是跨進程的就使用代理對象,不是跨進程的,我就使用同進程的那個對象.

接下來我們看在這個接口當中,我們實現了compute的方法.

在這個compute方法裏面,我們可以看到它首先用parcel.把數據序列化了,然後調用了transact這個方法.這個方法是一個native層方法,最終,它還是會調用到OnTransact這個方法

 

在這裏,我們可以看到onTransact它會根據調用號,在跨進程的時候,不會傳遞參數,只會傳遞編號,在這裏我們可以看到,它就會調用,我們剛纔所寫的conpute這個跨進程方法,這樣就是一個完整的Aidl跨進程調用.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章