換個角度理解Android的AIDL原理

鍾離四郎發表於2017-10-22

本文行思路

本篇文章筆者談論的是android使用AIDL進行程式間通訊原理,但本文不打算一上來就介紹如何使用AIDL,本文會先假設Android沒有提供AIDL我們應該如何“用自己的方式”實現IPC,介紹完這一點之後,本文再對比AIDL這種方式實現IPC,並嘗試理解AIDL背後程式碼之間的關係。下文圖片是本文“用自己的方式”實現IPC的案例互動圖,如下:

LibraryServer跨程式提供圖書查詢服務流程圖.png
LibraryServer跨程式提供圖書查詢服務流程圖.png

圖片解釋

藍色部分的LibraryServer和Client是本文案例中兩個不同的APP,其中LibraryServer能夠提供左邊綠色部分的“BookCheckService”服務(包含getBookInfo、getBookList),為了能夠擁有提供遠端服務的能力LibraryServer同時還“招聘”了Binder這種具有遠端互動能力的物件,於是LibraryServer通過“BookCheckService”+"Binder"這對組合就擁有提供遠端服務的能力了。而Client也是“招聘”了Binder,企圖通過Binder來使用遠端服務。“黃色部分”又是什麼意思呢?其實這只是筆者對Binder機制在底層通訊進行的極簡的描述,實際上Binder機制在底層通訊十分複雜,筆者打算放在其它篇章討論;“黃色”部分簡單地解釋了遠端服務LibraryServer其實是將它自己的Binder的控制程式碼註冊在核心,Client實際上拿到的只是LibraryServer的Binder的控制程式碼,通過核心的Binder對映,再與遠端服務互動。

Demo 關鍵程式碼分析

image.png
image.png

上文是Client APP執行後的顯示效果,功能很簡單,下面對主要程式碼進行說明:

Client端程式碼

image.png
image.png

image.png
image.png

下面這個函式是請求“查詢圖書資訊”遠端服務的實現邏輯

image.png
image.png

同樣請求“獲取圖書列表”遠端服務的實現邏輯如下:

image.png
image.png

遠端端LibraryServer 程式碼

image.png
image.png

image.png
image.png

image.png
image.png

##測試結果

image.png
image.png

AIDL實現IPC

上文提到的是使用“自己的方式”實現IPC,下文介紹在這個案例中是如何使用AIDL通訊的,關於如何在AndroidStudio建立AIDL檔案,這裡筆者不再細說,不清楚的朋友可以參考這篇文章:www.jianshu.com/p/d1fac6cce…

image.png
image.png

image.png
image.png

image.png
image.png

上圖是筆者使用AIDL自動成的BooKCheckService.java檔案,可以用下面的UML來描述各個類之間的聯絡,如下:

image.png
image.png

我們先來看以下關鍵程式碼:

image.png
image.png

再來看看Proxy類中的細節,如下:

image.png
image.png

到此可以看到AIDL實現IPC與上文我們以“以自己的方式”實現IPC本質是一樣的,只是AIDL語言會為我們自動生成相關的類,簡化我們的編碼工作。

案例原始碼

github.com/ZhongXiaoHo…

相關文章