Implementar o encerramento dinâmico envolve conectar fluxos de dados e executar processos dinâmicos, conforme detalhado nas seções a seguir.
Mudanças nas definições de HAL
O encerramento dinâmico exige informações sobre quais processos atendem a qual HAL interfaces (essas informações também poderão ser úteis posteriormente em outros contextos) conforme assim como não iniciar processos na inicialização e não reiniciá-los (até que solicitado novamente) quando saírem.
# 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
Alterações no init e no hwservicemanager
O desligamento dinâmico também exige que o hwservicemanager
informe
init
para iniciar os serviços solicitados. No Android 9,
init
inclui três mensagens de controle adicionais (por exemplo,
ctl.start
): ctl.interface_start
.
ctl.interface_stop
e ctl.interface_restart
.
Essas mensagens podem ser usadas para sinalizar o init
para abrir e fechar
para interfaces de hardware específicas. Quando um serviço é solicitado e não é
estiver registrado, hwservicemanager
solicita que o serviço seja
começar. No entanto, HALs dinâmicas não exigem o uso de nenhuma delas.
Determinar a saída da HAL
No Android 9, a saída da HAL precisa ser manual determinados. Para o Android 10 e versões mais recentes, ser determinado com ciclos de vida automáticos.
O encerramento dinâmico requer várias políticas para decidir quando iniciar uma
HAL e quando encerrá-la. Se a HAL decidir sair por qualquer motivo, ela
será reiniciado automaticamente quando necessário novamente usando as informações
fornecidos na definição da HAL e na infraestrutura fornecida pelas alterações em
init
e hwservicemanager
. Isso pode envolver um
algumas estratégias diferentes, incluindo:
- Uma HAL pode optar por chamar uma saída se alguém fizer um fechamento ou com uma API similar. Esse comportamento deve ser especificado na HAL correspondente interface gráfica do usuário.
- As HALs podem ser desligadas quando a tarefa é concluída (documentado na HAL ).
Ciclos de vida automáticos
O Android 10 adiciona mais suporte ao kernel e
hwservicemanager
, que permite que as HALs sejam encerradas automaticamente
quando não tiver clientes. Para usar esse recurso, siga todas as etapas em
Também mudanças nas definições da HAL
como:
- Registrar o serviço em C++ com
LazyServiceRegistrar
em vez da função de membro,registerAsService
, para exemplo:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Verifique se o cliente da HAL mantém uma referência à HAL de nível superior (a
interface registrada no
hwservicemanager
) somente quando em uso. Para evitar atrasos se essa referência for inserida em uma linha de execução hwbinder que continua em execução, o cliente também deve chamarIPCThreadState::self()->flushCommands()
depois de descartar o para garantir que o driver de vinculação seja notificado sobre os eventos associados mudanças na contagem de referências.