Począwszy od Androida 11, natywne usługi AIDL działające na partycji systemowej można uruchamiać i zatrzymywać dynamicznie w miarę potrzeby. Usługi dynamiczne są uruchamiane po pierwszym żądaniu i automatycznie zatrzymywane, gdy nie są już używane.
Usługi, które mogą działać dynamicznie
Ta funkcja jest dostępna tylko w przypadku usług natywnych, których cykl życia można kontrolować za pomocą funkcji init
i servicemanager
. Usługi w pakietach aplikacji nie są obsługiwane. Należy zamiast nich używać usług powiązanych.
Dynamiczne zamykanie polega na zamykaniu procesu, w którym działa usługa. Jeśli w ramach tego samego procesu występuje wiele usług, wszystkie muszą być zarejestrowane jako dynamiczne, aby były zgodne z tą funkcją. Ten proces zostanie zamknięty, gdy wszystkie usługi nie będą używane.
Konfigurowanie pliku init .rc usługi
Aby uruchomić usługę dynamicznie, dodaj te opcje do pliku init
.rc
usługi po linii service <name> <cmd>
.
interface aidl serviceName
disabled
oneshot
Te opcje umożliwiają:
interface aidl serviceName
: umożliwiaservicemanager
znalezienie usługi. Jeśli usługa korzysta z kilku interfejsów, zadeklaruj każdy z nich w osobnym wierszu. Te nazwy muszą być zgodne z wymaganiami usługiservicemanager
i mogą różnić się od nazwy procesu.disabled
: zapobiega automatycznemu uruchamianiu usługi podczas uruchamiania.oneshot
: uniemożliwia automatyczne uruchamianie usługi po jej zatrzymaniu.
Więcej informacji znajdziesz w Readme na temat języka inicjalizacji Androida w AOSP.
Przykłady:
Rejestrowanie usługi
Każda usługa jest tworzona i rejestrowana w servicemanager
. Rejestracja często odbywa się w pliku o nazwie main.cpp
, ale implementacja może się różnić. Rejestracja wygląda zwykle tak:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Rejestracja jest czasami abstrakcyjna przez BinderService::publish
lub
BinderService::instantiate
, które wywołują powyższy kod.
Aby zarejestrować usługę jako dynamiczną, zastąp jej kod rejestracyjny tym:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
Usługa servicemanager
komunikuje się z usługą LazyServiceRegistrar
, aby wyłączyć usługi na podstawie ich liczby referencyjnej.
Przykłady:
Konfigurowanie klientów usługi AIDL
Uzyskiwanie dostępu do usługi
Aby pobrać usługę typu lazy, musisz ją uruchomić, a następnie pobrać.
Wywołanie getService
w menedżerze usługi uruchamia usługę, ale zwykle chcesz, aby usługa była dostępna od razu, dlatego należy użyć wariantu waitForService
. Więcej informacji o korzystaniu z tych funkcji znajdziesz w dokumentacji dotyczącej backendu.
Zwolnij usługę
Dynamiczne zamykanie jest oparte na zliczaniu odwołań, więc klienci nie muszą utrzymywać usługi, gdy nie jest ona używana.
Przykłady:
Tymczasowe wyłączenie zamykania
Jeśli chcesz, aby usługa działała niezależnie do momentu ukończenia określonych zadań, a potem przełączyła się na działanie dynamiczne, możesz użyć funkcji LazyServiceRegistrar::forcePersist
, aby włączyć lub wyłączyć dynamiczne zamykanie. Jeśli jest wywoływana po stronie serwera, powinna być wywoływana przed funkcją registerService
.
Przykład: apexservice