動態執行 AIDL 服務

自 Android 11 起,在系統分區中執行的原生 AIDL 服務可視需要動態啟動及停止。動態服務會在首次要求時啟動,並在不再使用時自動停止。

可動態執行的服務

這項功能僅適用於原生服務,也就是生命週期可由 initservicemanager 控制的服務。應用程式套件中的服務 應使用繫結服務

動態關閉的運作方式是關閉服務的執行程序。 如果同一個程序中有多項服務,則所有服務都必須以動態方式註冊,才能與這項功能相容。這項程序接著會關閉 系統會在所有服務皆未使用時傳送提醒

設定服務的初始化 .rc 檔案

如要動態執行服務,請將下列選項新增至服務的 init .rc 檔案 (位於開頭的 service <name> <cmd> 行後方)。

interface aidl serviceName
disabled
oneshot

這些選項可執行以下操作:

  • interface aidl serviceName:允許 servicemanager 尋找服務。如果服務使用多個介面,請自行宣告每個介面。 互動這些名稱必須與 servicemanager 預期的名稱完全相同,並可能會 與程序名稱不同
  • disabled:防止服務在啟動時自動啟動。
  • oneshot:避免服務每次停止時自動重新啟動。

詳情請參閱 AOSP 中的 Android Init Language Readme

例如:

註冊服務

每項服務都會透過 servicemanager 建立及註冊。經常註冊 發生在名為 main.cpp 的檔案中,但實作方式可能有所不同。註冊內容通常如下所示:

using android::defaultServiceManager;

defaultServiceManager()->addService(serviceName, service);

註冊有時會由 BinderService::publishBinderService::instantiate,會呼叫上述程式碼。

如要將服務註冊為動態,請將註冊代碼替換為 包括:

#include <binder/LazyServiceRegistrar.h>

using android::binder::LazyServiceRegistrar;

auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);

servicemanager」會與「LazyServiceRegistrar」進行通訊,藉此關閉服務 依據參考檔案數計算排名

例如:

設定 AIDL 服務用戶端

取得服務

如要擷取延遲服務,必須啟動並擷取服務。 在服務管理員上呼叫 getService 會啟動服務,不過通常會啟動 您想要的服務就緒時即可;以及waitForService 應使用子類如要瞭解如何使用這些元素,請參閱後端專屬說明文件

發布服務

動態關閉功能會依據參照計數,因此用戶端在服務未使用時,不得保留該服務。

例如:

暫時停用關機功能

如果您希望服務能獨立執行,直到特定工作完成後再切換為動態行為,可以使用 LazyServiceRegistrar::forcePersist 切換動態關閉功能。如果這是從伺服器端呼叫,則應在 registerService 之前呼叫。

範例:apexservice