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.
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. 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 sein, damit sie mit dieser Funktion kompatibel sind. 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 Datei .rc
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 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 Erwartungen vonservicemanager
entsprechen und können sich vom Prozessnamen unterscheiden.disabled
: verhindert, dass der Dienst beim Starten 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 mit dem Namen 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 von BinderService::publish
oder BinderService::instantiate
abstrahiert, die den oben genannten 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 der Anzahl der Referenzen zu beenden.
Beispiele:
AIDL-Dienstclients konfigurieren
Dienst abrufen
Um einen Lazy-Dienst abzurufen, muss der Dienst 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 so bald wie möglich abrufen. Daher sollten Sie waitForService
-Varianten verwenden. Backend-spezifische Dokumentation zur Verwendung dieser Funktionen
Dienst veröffentlichen
Das dynamische Herunterfahren basiert auf der Referenzzählung. Clients dürfen den Dienst also nicht beibehalten, 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 dynamischem Verhalten wechseln soll, können Sie LazyServiceRegistrar::forcePersist
verwenden, um das dynamische Herunterfahren zu aktivieren und zu deaktivieren. Wenn dies serverseitig aufgerufen wird, sollte es vor registerService
aufgerufen werden.
Beispiel: apexservice