Ab Android 11 können native AIDL-Dienste, die in der Systempartition ausgeführt werden, dynamisch gestartet und beendet werden, wenn sie benötigt werden. Dynamische Dienste werden gestartet, wenn sie zum ersten Mal angefordert werden, und automatisch beendet, wenn sie nicht mehr verwendet werden.
Dynamisch ausführbare Dienste
Diese Funktion ist nur für native Dienste verfügbar, deren Lebenszyklus mit init
und servicemanager
gesteuert werden kann. Dienste innerhalb von App-Paketen werden nicht unterstützt. Stattdessen sollten gebundene Dienste verwendet werden.
Beim dynamischen Herunterfahren wird der Prozess beendet, in dem der Dienst ausgeführt wird. Wenn mehrere Dienste im selben Prozess vorhanden sind, müssen alle als dynamisch registriert werden, um mit diesem Feature kompatibel zu sein. Dieser Vorgang wird dann beendet, wenn alle Dienste nicht mehr verwendet werden.
Init-Datei eines Dienstes konfigurieren
Wenn Sie einen Dienst dynamisch ausführen möchten, fügen Sie der Init-.rc
-Datei des Dienstes nach der ersten service <name> <cmd>
-Zeile die folgenden Optionen hinzu.
interface aidl serviceName
disabled
oneshot
Mit diesen Optionen können Sie Folgendes tun:
interface aidl serviceName
: Ermöglicht esservicemanager
, den Dienst zu finden. Wenn der Dienst mehrere Schnittstellen verwendet, deklarieren Sie jede Schnittstelle in einer eigenen Zeile. Diese Namen müssen genau den Anforderungen vonservicemanager
entsprechen und können vom Prozessnamen abweichen.disabled
: Verhindert, dass der Dienst beim Starten automatisch gestartet wird.oneshot
: Verhindert, dass der Dienst jedes Mal automatisch neu gestartet wird, wenn er angehalten wird.
Weitere Informationen finden Sie in der Android Init Language Readme in AOSP.
Beispiele:
Dienst registrieren
Jeder Dienst wird mit servicemanager
erstellt und registriert. Die Registrierung erfolgt häufig in einer Datei mit dem Namen main.cpp
. Die Implementierung kann jedoch variieren. Die Registrierung sieht normalerweise so aus:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Die Registrierung wird manchmal durch BinderService::publish
oder BinderService::instantiate
abstrahiert, die den obigen Code aufrufen.
Wenn Sie einen Dienst als dynamisch registrieren möchten, ersetzen Sie seinen Registrierungscode durch Folgendes:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
kommuniziert mit LazyServiceRegistrar
, um Dienste basierend auf ihren Referenzzählungen herunterzufahren.
Beispiele:
AIDL-Dienstclients konfigurieren
Dienst abrufen
Um einen Lazy-Dienst abzurufen, muss er gestartet und dann abgerufen werden.
Wenn Sie getService
auf dem Dienstmanager aufrufen, wird der Dienst gestartet. Normalerweise möchten Sie den Dienst jedoch sobald er verfügbar ist nutzen. Daher sollten waitForService
-Varianten verwendet werden. Weitere Informationen zur Verwendung finden Sie in der backendspezifischen Dokumentation.
Dienst veröffentlichen
Das dynamische Herunterfahren basiert auf der Referenzzählung. Clients dürfen den Dienst also nicht halten, wenn er nicht verwendet wird.
Beispiele:
Herunterfahren vorübergehend deaktivieren
Wenn ein Dienst unabhängig ausgeführt werden soll, bis bestimmte Aufgaben abgeschlossen sind, und dann zu einem dynamischen Verhalten wechseln soll, können Sie das dynamische Herunterfahren mit LazyServiceRegistrar::forcePersist
aktivieren und deaktivieren. Wenn dieser Befehl von der Serverseite aufgerufen wird, sollte er vor registerService
aufgerufen werden.
Beispiel: apexservice