AIDL-Dienste dynamisch ausführen

In Android 11 und höher 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 beim ersten Aufruf gestartet und automatisch beendet, wenn sie nicht mehr verwendet werden.

Dienste, die dynamisch ausgeführt werden können

Diese Funktion ist nur für native Dienste verfügbar, deren Lebenszyklen von init und servicemanager gesteuert werden können. Dienste in App-Paketen werden nicht unterstützt und sollten stattdessen gebundene Dienste verwenden.

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 dieser Funktion kompatibel zu sein. Dieser Prozess wird dann beendet, wenn alle Dienste nicht mehr verwendet werden.

Init-Datei „.rc“ eines Dienstes konfigurieren

Wenn Sie einen Dienst dynamisch ausführen möchten, fügen Sie der Init .rc Datei des Dienstes nach der führenden service <name> <cmd> Zeile die folgenden Optionen hinzu.

interface aidl serviceName
disabled
oneshot

Diese Optionen haben folgende Auswirkungen:

  • interface aidl serviceName: Ermöglicht servicemanager, den Dienst zu finden. Wenn der Dienst mehrere Schnittstellen verwendet, deklarieren Sie jede Schnittstelle in einer eigenen Zeile. Diese Namen müssen genau dem entsprechen, was servicemanager erwartet, und können sich vom Prozessnamen unterscheiden.
  • disabled: Verhindert, dass der Dienst beim Start automatisch gestartet wird.
  • oneshot: Verhindert, dass der Dienst jedes Mal automatisch neu gestartet wird, wenn er beendet wird.

Weitere Informationen finden Sie in der Readme-Datei zur Android-Init-Sprache in AOSP.

Beispiele:

Dienst registrieren

Jeder Dienst wird mit servicemanager erstellt und registriert. Die Registrierung erfolgt häufig in einer Datei namens main.cpp, die Implementierung kann jedoch variieren. Die Registrierung sieht in der Regel 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 den 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ählern zu beenden.

Beispiele:

AIDL-Dienstclients konfigurieren

Dienst abrufen

Um einen Lazy-Dienst abzurufen, muss er zuerst gestartet und dann abgerufen werden. Wenn Sie getService für den Dienstmanager aufrufen, wird der Dienst gestartet. In der Regel möchten Sie den Dienst jedoch abrufen, sobald er verfügbar ist. Daher sollten Sie waitForService-Varianten verwenden. Informationen zur Verwendung finden Sie in der backend-spezifischen Dokumentation.

Dienst freigeben

Das dynamische Herunterfahren basiert auf der Referenzzählung. Daher dürfen Clients den Dienst nicht belegen, 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 dynamisch ausgeführt werden soll, können Sie mit LazyServiceRegistrar::forcePersist das dynamische Herunterfahren aktivieren und deaktivieren. Wenn dies serverseitig aufgerufen wird, sollte es vor registerService aufgerufen werden.

Beispiel: apexservice