Android 之 Binder與程式間通訊
Binder機制是android中實現的程式間通訊的架構,它採用的是c/s架構,client通過代理完成對server的呼叫。
ServiceManager
既然這裡提到了server,那麼我們有必要先了解下在android中是怎麼來管理server的。先來看一個重要的Native程式:ServiceManager,從名字可以看出來,這個是用來管理所有server的。在init程式啟動之後,會啟動另外兩個重要的程式,一個是我們上一篇講的Zygote程式,另外一個就是這個ServiceManager程式了,這兩個程式啟動之後就建立了android的執行環境和server的管理環境。ServiceManager程式啟動之後其他server就可以通過ServiceManager的add_service和check_service來新增和獲取特定的server了。關於ServiceManager在接下來會詳細介紹,因為Binder會涉及到ServiceManager,所以先簡單介紹下,有個大概印象,知道他是幹什麼的就行了。
Binder與程式間通訊
在本篇介紹中,我們所指的客戶端沒有特別說明的話就指應用程式。應為service和serviceManager通訊也會涉及到IPC。
我們還是從activity的啟動開始來研究Binder的機制。來看下startActivity涉及通訊的類圖:
在ActivityManagerProxy中,有這句程式碼
- IBinder b = ServiceManager.getService("activity");
- 繼續看下getService方法,在getService中對資料進行了序列化封裝,並通過BinderProxy的native方法向ServiceManager傳送請求,獲取Binder的代理物件。看下getService程式碼:
- /*
- * 從ServiceManager中獲取service對應的代理Binder
- * @param na
- * @return
- * @throws RemoteException
- */
- public IBinder getService(String name) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IServiceManager.descriptor);
- data.writeString(name);
- mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
- IBinder binder = reply.readStrongBinder();
- reply.recycle();
- data.recycle();
- return binder;
- }
也就是說,在android中進行IPC的話,需要先通過ServiceManager獲得客戶端的代理,然後再通過該代理與對應的service進行通訊。
- 建立和ServiceManager的連線,獲取客戶端物件的代理Binder。
- 客戶端再通過該代理binder和伺服器端進行通訊。
真正的Binder
我們在上面所提到的這些Binder實際上只是JVM中的Binder,主要作用是提供了訪問C++中的代理Binder,叫做BpBinder(BproxyBinder)。真正的Binder是Linux上的一個驅動裝置,專門用來做android的資料交換。
從上面分析可以看出,一次IPC通訊大概有以下三個步驟:
- 在JVM中對資料進行序列化,並通過BinderProxy傳遞到C++中。
- C++中的BpBinder對資料進行處理,並傳入到Binder裝置中(這裡是在ProcessState類中處理並呼叫BpBinder).
- Service從核心裝置中讀取資料。
既然在C++中,處理資料主要是在ProcessState中,那麼我們就來看看ProcessState的程式碼,在getContextObject中呼叫了getStrongProxyForHandle方法,從而獲取了代理物件BpBinder:
- sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
- {
- sp<IBinder> result;
- AutoMutex _l(mLock);
- handle_entry* e = lookupHandleLocked(handle);
- if (e != NULL) {
- // We need to create a new BpBinder if there isn't currently one, OR we
- // are unable to acquire a weak reference on this current one. See comment
- // in getWeakProxyForHandle() for more info about this.
- IBinder* b = e->binder;
- if (b == NULL || !e->refs->attemptIncWeak(this)) {
- b = new BpBinder(handle);
- e->binder = b;
- if (b) e->refs = b->getWeakRefs();
- result = b;
- } else {
- // This little bit of nastyness is to allow us to add a primary
- // reference to the remote proxy when this team doesn't have one
- // but another team is sending the handle to us.
- result.force_set(b);
- e->refs->decWeak(this);
- }
- }
- return result;
- }
再來看看BpBinder中的transact方法程式碼:
- status_t BpBinder::transact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
- {
- // Once a binder has died, it will never come back to life.
- if (mAlive) {
- status_t status = IPCThreadState::self()->transact(
- mHandle, code, data, reply, flags);
- if (status == DEAD_OBJECT) mAlive = 0;
- return status;
- }
- return DEAD_OBJECT;
- }
總結:
在android中,使用Binder進行程式間的通訊,並採用C/S架構Android中的Binder分為JVM中的、C++中的、和真正的linux中的Binder塊裝置程式間通訊首先是從JVM中對資料進行轉化並傳遞到C++中,C++中的BpBinder對資料進行處理寫入到linux中的Binder裝置,並接受Service端得請求,請求完畢後按照原路返回給呼叫端。相關文章
- Android 程式之間通訊Android
- Flutter與android之間的通訊FlutterAndroid
- Android native程式間通訊例項-binder結合共享記憶體Android記憶體
- Binder通訊機制與IPC通訊.md
- Android多程式之Binder的使用Android
- Android程式間通訊詳解Android
- 一篇看懂Android與Flutter之間的通訊AndroidFlutter
- Android C++層使用Binder通訊的方法AndroidC++
- Android程式間通訊,AIDL工作原理AndroidAI
- Android 系統原始碼-2:Binder 通訊機制Android原始碼
- Linux程式之間如何通訊?Linux
- linux 程式間通訊之管道Linux
- linux 程式間通訊之FIFOLinux
- Android程式間通訊(複習筆記)Android筆記
- Binder通訊機制
- Android開發之執行緒間通訊Android執行緒
- Javascript與Python之間的程序間通訊JavaScriptPython
- Electron實戰之程式間通訊
- Flutter混合開發(三):Android與Flutter之間通訊詳細指南FlutterAndroid
- 實現不同程式之間的通訊
- 程式間通訊之共享記憶體記憶體
- 溫故之.NET程式間通訊——管道
- 程式間通訊——XSI IPC之訊息佇列佇列
- Linux 程式間通訊之System V 訊號量Linux
- Android高階進階之路【五】深入剖析Android系統Binder通訊機制Android
- Android多程式之Binder解綁監聽的問題Android
- Android執行緒間通訊Android執行緒
- Linux程式間通訊之共享記憶體Linux記憶體
- Android跨程式通訊Android
- Android 多程式通訊Android
- linux 程式間通訊之System V 訊息佇列Linux佇列
- Linux程式間通訊Linux
- PHP程式間通訊PHP
- 程式間的通訊
- 程式間通訊——LINUXLinux
- 程式間通訊(Socket)
- Android 元件化之通訊(多模組,多程式)Android元件化
- Android多程式通訊之幾個基本問題Android
- Android 多程式通訊之幾個基本問題Android