Implementare USB HAL

La release di Android 8.0 sposta la gestione dei comandi USB dagli script in un demone USB nativo per una migliore configurazione e affidabilità del codice.init Per la configurazione della funzione Gadget, vengono utilizzati script init (trigger delle proprietà) per eseguire operazioni sui gadget specifiche per il dispositivo.

Nelle release precedenti, queste configurazioni specifiche del dispositivo venivano ottenute tramite script init specifici del dispositivo (utilizzando gli attivatori delle proprietà). Il passaggio a un design di livello di astrazione hardware (HAL) consente un'implementazione molto più chiara che risolve i seguenti problemi:

  1. Operazioni come le scritture sui nodi sysfs del kernel potrebbero non riuscire, ma non essere propagate al codice dei framework che imposta il trigger della proprietà. Di conseguenza, i framework presumono erroneamente che le operazioni siano riuscite anche se non sono andate a buon fine in modo silenzioso.
  2. Gli script init hanno un numero limitato di operazioni che possono essere eseguite.

La release di Android 12 aggiunge il supporto dell'HAL per gadget USB per i modelli di controllo della rete (NCM) e le chiamate API che restituiscono sia il numero di versione dell'HAL sia la velocità USB. Per maggiori informazioni sulle chiamate API disponibili tramite l'HAL USB, consulta il riepilogo del pacchetto android.hardware.usb.

HAL e Treble

Gli script init specifici del dispositivo sono stati utilizzati in sostituzione dei livelli HAL per eseguire operazioni USB specifiche del dispositivo. USB (tramite ADB) è un'interfaccia principale per il debug dei problemi di sistema. Avere un demone nativo per eseguire la configurazione USB elimina la dipendenza dal codice del framework, quindi anche se il framework si arresta in modo anomalo, l'USB dovrebbe essere in esecuzione.

Nel modello Trebleintrodotto anche in Android 8.0, tutti gli HAL sono isolati dai servizi di sistema e devono essere eseguiti nei propri demoni nativi. In questo modo, viene eliminato il requisito di avere un demone USB esclusivo, poiché il livello HAL funge anche da demone USB.

L'implementazione HAL predefinita si occupa di tutti i dispositivi precedenti ad Android 8.0. Pertanto, non sarà necessario alcun intervento specifico per i dispositivi precedenti ad Android 8.0. Android 8.0 utilizza l'interfaccia HAL per eseguire query sullo stato delle porte USB e per eseguire scambi di ruolo di alimentazione e dati.

Implementazione

La nuova interfaccia HAL USB deve essere implementata su ogni dispositivo lanciato su Android 8.0. L'implementazione predefinita dovrebbe occuparsi dei dispositivi precedenti ad Android 8.0. L'implementazione predefinita è sufficiente se il dispositivo utilizza la classe dual_role_usb per segnalare lo stato della porta di tipo C. Potrebbero essere necessarie modifiche minime agli script USB specifici del dispositivo per trasferire la proprietà dei nodi USB-C al sistema.