Wdrożenie dynamicznego wyłączania obejmuje okablowanie przepływów danych i wykonanie dynamicznych procesach, jak opisano w poniższych sekcjach.
Zmiany w definicjach listy HAL
Dynamiczne wyłączanie wymaga informacji o tym, które procesy obsługują dane HAL (te informacje mogą być również przydatne później w innych kontekstach), tak oraz nie uruchamiać procesów podczas uruchamiania i nie uruchamiać ich ponownie (do żądania), gdy użytkownik ją zamknie.
# some init.rc script associated with the HAL service vendor.some-service-name /vendor/bin/hw/some-binary-service # init language extension, provides information of what service is served # if multiple interfaces are served, they can be specified one on each line interface android.hardware.light@2.0::ILight default # restarted if hwservicemanager dies # would also cause the hal to start early during boot if disabled wasn't set class hal # will not be restarted if it exits until it is requested to be restarted oneshot # will only be started when requested disabled # ... other properties
Zmiany w init i hwservicemanager
Dynamiczne wyłączenie wymaga też tych informacji: hwservicemanager
init
, aby uruchomić żądane usługi. W Androidzie 9
init
zawiera 3 dodatkowe komunikaty kontrolne (np.
ctl.start
): ctl.interface_start
,
ctl.interface_stop
i ctl.interface_restart
.
Te komunikaty mogą posłużyć do zasygnalizowania, że init
ma otworzyć lub wyłączyć widok
do konkretnych interfejsów sprzętowych. Gdy poproszono o usługę, a nie
zarejestrowano, hwservicemanager
prosi o zmianę usługi
rozpoczęto. Dynamiczne HAL nie wymagają jednak żadnego z nich.
Określanie wyjścia HAL
W Androidzie 9 zdarzenie HAL trzeba skonfigurować ręcznie określonych. W Androidzie 10 i nowszych może też określić na podstawie automatycznych cykli życia.
Dynamiczne wyłączanie wymaga wielu zasad do określenia, kiedy rozpocząć
HAL i kiedy wyłączyć HAL. Jeśli HAL z jakiegokolwiek powodu podejmie decyzję o zamknięciu,
zostanie automatycznie ponownie uruchomiony, gdy zajdzie taka potrzeba, z wykorzystaniem tych danych
podane w definicji HAL oraz infrastruktura zapewniana przez zmiany
init
i hwservicemanager
. Może to wymagać
kilka różnych strategii, w tym:
- HAL może samodzielnie wywoływać zdarzenie wyjściowe, jeśli ktoś wywoła zakończenie i podobny interfejs API. To zachowanie musi być określone w odpowiedniej HAL za pomocą prostego interfejsu online.
- Listy HAL mogą być wyłączane po zakończeniu ich zadań (zostały ujęte w pliku HAL ).
Automatyczne cykle życia
Android 10 ma większą obsługę jądra systemu,
hwservicemanager
, który umożliwia automatyczne wyłączanie HAL
gdy klient nie ma klientów. Aby korzystać z tej funkcji, wykonaj wszystkie czynności opisane w
również zmiany w definicjach listy HAL,
jako:
- Zarejestruj usługę w C++ za pomocą
LazyServiceRegistrar
zamiast funkcji składowejregisterAsService
, dla argumentu przykład:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Sprawdź, czy klient HAL przechowuje odwołanie do HAL najwyższego poziomu (parametr
zarejestrowany w
hwservicemanager
) tylko wtedy, gdy jest w użyciu. Aby uniknąć opóźnień w przypadku usunięcia tego odwołania do wątku hwbinder który będzie w dalszym ciągu realizowany, klient powinien również wywołać funkcjęIPCThreadState::self()->flushCommands()
po usunięciu aby mieć pewność, że osoba zajmująca się segregatorem zostanie poinformowana o powiązanych zmian liczby odwołań.