AIDL-Dienste dynamisch ausführen

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 es servicemanager, 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 von servicemanager 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