[App開發]用 AIDL 來跨進程開發Android app吧 !

AIDL介紹

什麼是AIDL呢?


有時候你想要透過A進程去跟B進程溝通
這時候你就可以透過AIDL來跟不同進程溝通

例如:


1.可以用在兩個app間溝通
2.可以用在app跟原生kernel層溝通 (但是必需自build AOSP 把寫好的應用放進底層)
3.或是app跟service溝通…等等

另外AIDL是常用IPC方案
我也有寫另一篇整理常用的IPC方案
有需要可以參考:


AIDL實作

步驟1 : 先定義AIDL介面
  • 這步驟你可以隨意的在筆記本裡面寫
    或者你可以用IDE去寫 (這裡我是用Android studio)
    只要是可以打字的地方都可以寫

    接著定義你AIDL對外有什麼接口
    例如你想要有個功能是取得所有更新列表
    就可以創一個類似 getUpdateList的接口
    想要取得狀態就寫一個getStatus接口
    以此類推…
    1.png

  • 最後你要把副檔名存成.aidl就可以
    11.png

步驟2 : 實作Service
  • 完成上面的AIDL介面後
    需要build一下
    可以用cli
    ./gradle build 去build
    或者使用Android studio裡面的 Build> Rebuild Project 去讓他build一下
    12.png

  • build完後會產生一個同樣檔名的.java
    13.png

  • 通常在Android app 要呼叫AIDL接口會用Service去接
    所以先繼承Service 並override該有的週期方法
    範例如下:

  • 接著在同一個service加入剛剛build完後產生的AIDL實例 :

小技巧: AIDL 介面 與 Service package path 需一樣 否則無法編譯成功

下方三張圖為示意圖:

3.png

4.png

5.png

步驟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原本就沒支援這個類型
    所以我就再定義一層抽象層
    那我實作的時候只要記得在中間加邏輯就好
    9.png
(選擇性) 步驟7-其他用例:AIDL包成Jar檔
  • 那時候遇到需求是透過groovy語法直接build一個jar檔
    讓別的process直接套就能使用
    可以這樣做:
    10.png

You might also enjoy