A versão do Android 8.0 move o gerenciamento de comandos USB do scripts init
para um daemon USB nativo para melhor configuração e confiabilidade
de código. Para a configuração da função do gadget, os scripts init
(acionadores de propriedade) são usados para executar operações de gadget específicas do dispositivo.
Em versões anteriores, essas configurações específicas do dispositivo eram alcançadas por
scripts init
específicos do dispositivo, usando acionadores de propriedade. A mudança para um
design de camada de abstração de hardware (HAL) resulta em uma implementação muito mais limpa
que resolve estes problemas:
- Operações como gravações nos nós sysfs do kernel podem falhar, mas não ser propagadas de volta para o código do framework que define o gatilho da propriedade. Como resultado, os frameworks presumem incorretamente que as operações foram bem-sucedidas, mesmo que tenham falhado silenciosamente.
- Os scripts
init
têm um número limitado de operações que podem ser executadas.
A versão do Android 12 adiciona suporte à HAL de gadget USB para modelos de controle de rede (NCM, na sigla em inglês) e chamadas de API que retornam o número da versão da HAL e a velocidade do USB. Para mais
informações sobre as chamadas de API disponíveis pelo HAL de USB, consulte
o resumo do pacote android.hardware.usb
.
HAL e Treble
Os scripts init
específicos do dispositivo foram usados como uma substituição para
camadas HAL para realizar operações USB específicas do dispositivo. O USB (por meio do ADB) é uma
interface principal para depurar problemas do sistema. Ter um daemon nativo para realizar
a configuração USB elimina a dependência do código do framework. Assim, mesmo que o
framework falhe, o USB estará em execução.
No modelo Treble também introduzido no Android 8.0, todos os HALs são isolados dos serviços do sistema e precisam ser executados nos próprios daemons nativos. Isso elimina a necessidade de ter um daemon USB exclusivo, já que a camada HAL funciona como um daemon USB.
A implementação padrão da HAL cuida de todos os dispositivos anteriores ao Android 8.0. Portanto, não haveria nenhum trabalho específico para dispositivos com o Android 8.0 ou versões anteriores. O Android 8.0 usa a interface HAL para consultar o status das portas USB e realizar trocas de função de dados e de energia.
Implementação
A nova interface HAL USB precisa ser implementada em todos os dispositivos lançados no Android 8.0.
A implementação padrão precisa cuidar dos dispositivos com versões anteriores ao Android 8.0. A implementação
padrão é suficiente se o dispositivo usa a classe dual_role_usb
para informar
o status da porta Type-C. Mudanças triviais podem ser necessárias em scripts USB específicos do dispositivo
para transferir a propriedade dos nós typc-c para o sistema.