HALs com disponibilidade dinâmica

O Android 9 oferece suporte ao desligamento dinâmico de hardware do Android subsistemas quando eles não estão em uso ou não são necessários. Por exemplo, quando um usuário não estiver usando Wi-Fi, os subsistemas de Wi-Fi não devem estar ocupando memória, energia ou outros recursos do sistema. Nas versões anteriores do Android, HALs/drivers foram mantidas abertas em dispositivos Android durante todo o período telefone foi inicializado.

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 chamar IPCThreadState::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.