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