Dynamiczne uruchamianie usług AIDL

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 cykle życia można kontrolowane przez init i servicemanager. Usługi w pakietach aplikacji nie są są obsługiwane i powinny używać powiązanych usług .

Dynamiczne wyłączanie polega na zatrzymaniu 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ą. Proces ten zostanie wyłączony gdy żadne usługi nie są używane.

Konfigurowanie pliku init.rc usługi

Aby dynamicznie uruchamiać usługę, dodaj do jej inicjowania te opcje .rc za początkowym wierszem service <name> <cmd>.

interface aidl serviceName
disabled
oneshot

Te opcje umożliwiają:

  • interface aidl serviceName: umożliwia usłudze servicemanager znalezienie usługi. Jeśli usługa korzysta z kilku interfejsów, zadeklaruj każdy z nich oddzielnie. . Te nazwy muszą być zgodne z oczekiwaniami usługi servicemanager i mogą być 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 dotyczącej języka inicjalizacji Androida w AOSP.

Przykłady:

Rejestrowanie usługi

Każda usługa jest tworzona i rejestrowana w servicemanager. Często się rejestrum ma miejsce w pliku o nazwie main.cpp, ale implementacja może być różna. rejestracja zwykle wygląda 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:

Skonfiguruj klienty 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 mogą przechowywać 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łącz się na zachowanie dynamiczne, LazyServiceRegistrar::forcePersist, aby włączać i wyłączać dynamiczne wyłączanie. Jeśli jest wywoływany po stronie serwera, powinien zostać wywołany przed registerService

Przykład: apexservice