Począwszy od Androida 11, natywne usługi AIDL działające w partycji systemowej można uruchamiać i zatrzymywać dynamicznie w zależności od potrzeb. Usługi dynamiczne uruchamiają się, gdy po raz pierwszy zostaną o to poproszone, i automatycznie zatrzymują się, 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że być kontrolowany przez aplikacje init
i servicemanager
. Usługi w pakietach aplikacji nie są obsługiwane i zamiast nich należy używać usług powiązanych.
Dynamiczne wyłączanie polega na zamknięciu procesu, w którym działa usługa. Jeśli w tym samym procesie istnieje wiele usług, wszystkie muszą być zarejestrowane jako dynamiczne, aby były zgodne z tą funkcją. Gdy wszystkie usługi nie będą używane, proces zostanie zamknięty.
Konfigurowanie pliku init .rc usługi
Aby uruchomić usługę dynamicznie, dodaj te opcje do pliku init usługi po wiodącej linii service <name> <cmd>
..rc
interface aidl serviceName
disabled
oneshot
Te opcje wykonują te działania:
interface aidl serviceName
: umożliwiaservicemanager
znalezienie usługi. Jeśli usługa korzysta z wielu interfejsów, zadeklaruj każdy z nich w osobnym wierszu. Te nazwy muszą być dokładnie takie, jakich oczekujeservicemanager
, i mogą się różnić od nazwy procesu.disabled
: zapobiega automatycznemu uruchamianiu usługi podczas włączania.oneshot
: zapobiega automatycznemu ponownemu uruchamianiu usługi za każdym razem, gdy zostanie ona zatrzymana.
Więcej informacji znajdziesz w pliku README dotyczącym języka inicjującego 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 sposób jej przeprowadzenia może się różnić. Rejestracja zwykle wygląda tak:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Rejestracja jest czasami abstrahowana przez BinderService::publish
lub
BinderService::instantiate
, które wywołują powyższy kod.
Aby zarejestrować usługę jako dynamiczną, zastąp jej kod rejestracji tym kodem:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
komunikuje się z LazyServiceRegistrar
, aby wyłączać usługi na podstawie liczby odwołań.
Przykłady:
Konfigurowanie klientów usług AIDL
Pobieranie usługi
Aby pobrać usługę leniwą, musisz ją najpierw uruchomić, a potem pobrać.
Wywołanie getService
na menedżerze usług spowoduje uruchomienie usługi, ale zwykle chcesz uzyskać usługę, gdy tylko będzie dostępna, i należy użyć wariantów waitForService
. Informacje o tym, jak ich używać, znajdziesz w dokumentacji dotyczącej konkretnego backendu.
Zwolnij usługę
Dynamiczne wyłączanie jest oparte na zliczaniu odwołań, więc klienci nie mogą utrzymywać połączenia z usługą, 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 wykonania określonych zadań, a następnie przełączyła się na zachowanie dynamiczne, możesz użyć LazyServiceRegistrar::forcePersist
, aby włączyć i wyłączyć dynamiczne zamykanie. Jeśli ta funkcja jest wywoływana po stronie serwera, powinna być wywoływana przed registerService
.
Przykład: apexservice