[App開發]用 AIDL 來跨進程開發Android app吧 !
AIDL介紹
有時候你想要透過A進程去跟B進程溝通
這時候你就可以透過AIDL來跟不同進程溝通
1.可以用在兩個app間溝通
2.可以用在app跟原生kernel層溝通 (但是必需自build AOSP 把寫好的應用放進底層)
3.或是app跟service溝通…等等
另外AIDL是常用IPC方案
我也有寫另一篇整理常用的IPC方案
有需要可以參考:
AIDL實作
-
這步驟你可以隨意的在筆記本裡面寫
或者你可以用IDE去寫 (這裡我是用Android studio)
只要是可以打字的地方都可以寫
接著定義你AIDL對外有什麼接口
例如你想要有個功能是取得所有更新列表
就可以創一個類似 getUpdateList的接口
想要取得狀態就寫一個getStatus接口
以此類推…
-
最後你要把副檔名存成.aidl就可以
-
完成上面的AIDL介面後
需要build一下
可以用cli
./gradle build
去build
或者使用Android studio裡面的Build> Rebuild Project
去讓他build一下
-
build完後會產生一個同樣檔名的.java
-
通常在Android app 要呼叫AIDL接口會用Service去接
所以先繼承Service 並override該有的週期方法
範例如下:
-
接著在同一個service加入剛剛build完後產生的AIDL實例 :
下方三張圖為示意圖:
把步驟2
的Service加入AndroidManifest.xml內並新增action
這邊的action是對應到之後步驟5
要用ServiceConnection去綁定的action
action android:name="elegant.access.service.IRSSmartService"
- 這邊之後就可以開始把你的AIDL介面 + 實作建立AIDL實例化的service
給其他跨process的app或別層使用
在Android內的話直接在你要的地方用Intent啟動就行了
詳細參考5~7步驟
- 如果你是要在應用層用你的AIDL Service可以參考下面的code
用Intent去bind的AIDL service就好了
之後你就可以直接操作裡面已經實作好的方法
例如:
eleAcesAPI.getUpdateList();
- 那如果是要用在
非應用層
這邊分享個經驗
:之前遇過有專案要求應用層定義AIDL介面就好
實際使用要放在framework kernal層 (剛好該專案是自己做OTA)
所以如果你也是
只要開AIDL介面就好
這樣可以只做到步驟3
就完成了
之後再看你要實作的層級是否支援AIDL
例如:我遇到的專案是自己做OTA
能自定義binder
所以就用C#寫了一個接了AIDL介面的service
之後再在app層綁定就好
這裡是用反射的方法
去綁定kernel寫好的service
綁定範例:
- 這邊是因為專案有些特定需求的回傳值
例如Calendar
但因為AIDL原本就沒支援這個類型
所以我就再定義一層抽象層
那我實作的時候只要記得在中間加邏輯就好
- 那時候遇到需求是透過groovy語法直接build一個jar檔
讓別的process直接套就能使用
可以這樣做: