O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

HALs disponíveis dinamicamente

O Android 9 oferece suporte ao desligamento dinâmico de subsistemas de hardware Android quando eles não estão em uso ou não são necessários. Por exemplo, quando um usuário não está usando Wi-Fi, os subsistemas Wi-Fi não devem ocupar memória, energia ou outros recursos do sistema. Em versões anteriores do Android, HALs / drivers eram mantidos abertos em dispositivos Android durante todo o tempo de inicialização do telefone Android.

Implementar o desligamento 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 desligamento dinâmico requer informações sobre quais processos atendem a quais interfaces HAL (essas informações também podem ser úteis posteriormente em outros contextos), bem como não iniciar processos na inicialização e não reiniciá-los (até que sejam solicitados novamente) quando eles saem.

# 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

Mudanças no init e hwservicemanager

O desligamento dinâmico também requer que o hwservicemanager diga ao init para iniciar os serviços solicitados. No Android 9, o 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 init e desativar interfaces de hardware específicas. Quando um serviço é solicitado e não é registrado, o hwservicemanager solicita que o serviço seja iniciado. No entanto, HALs dinâmicos não exigem o uso de nenhum desses.

Determinando a saída de HAL

No Android 9, a saída do HAL deve ser determinada manualmente. Para Android 10 e superior, ele também pode ser determinado com ciclos de vida automáticos .

O desligamento dinâmico requer várias políticas para decidir quando iniciar um HAL e quando desligar um HAL. Se um HAL decidir sair por qualquer motivo, ele será reiniciado automaticamente quando for necessário novamente, usando as informações fornecidas na definição de HAL e a infraestrutura fornecida pelas alterações em init e hwservicemanager . Isso pode envolver algumas estratégias diferentes, incluindo:

  • Um HAL pode escolher chamar exit em si mesmo se alguém chamar um close ou API semelhante nele. Esse comportamento deve ser especificado na interface HAL correspondente.
  • Os HALs podem ser desligados quando sua tarefa é concluída (documentada no arquivo HAL).

Ciclos de vida automáticos

O Android 10 adiciona mais suporte ao kernel e ao hwservicemanager , o que permite que os HALs sejam encerrados automaticamente sempre que não tiverem clientes. Para usar este recurso, execute todas as etapas em Alterações nas definições de HAL , bem como:

  • Registre o serviço em C ++ com LazyServiceRegistrar vez da função de membro, registerAsService , por exemplo:
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • Verifique se o cliente HAL mantém uma referência ao HAL de nível superior (a interface registrada com hwservicemanager ) apenas quando está em uso. Para evitar atrasos se esta referência for descartada em um encadeamento hwbinder que continua em execução, o cliente também deve chamar IPCThreadState::self()->flushCommands() depois de descartar a referência para garantir que o driver do fichário seja notificado da contagem de referência associada alterar.