La release di Android 8.0 sposta la gestione dei comandi USB fuori dagli script init
e in un daemon USB nativo per una migliore configurazione e affidabilità del codice. Per la configurazione della funzione Gadget, vengono utilizzati script init
(trigger di proprietà) per eseguire operazioni specifiche del gadget.
Nelle versioni precedenti, queste configurazioni specifiche per il dispositivo venivano ottenute tramite
script init
specifici per il dispositivo (utilizzando trigger di proprietà). Il passaggio a un design
Hardware Abstraction Layer (HAL) comporta un'implementazione molto più pulita
che risolve questi problemi:
- Operazioni come le scritture nei nodi sysfs del kernel potrebbero non riuscire, ma non essere propagate di nuovo al codice dei framework che imposta il trigger della proprietà. Di conseguenza, i framework presuppongono erroneamente che le operazioni siano riuscite anche se non sono riuscite in modo invisibile.
- Gli script
init
hanno un numero limitato di operazioni che possono essere eseguite.
La release di Android 12 aggiunge il supporto HAL per gadget USB per i modelli di controllo di rete (NCM) e le chiamate API che restituiscono sia il numero di versione 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 per il dispositivo sono stati utilizzati in sostituzione dei
livelli HAL per eseguire operazioni USB specifiche per il dispositivo. L'USB (tramite ADB) è un'interfaccia principale per il debug dei problemi di sistema. La presenza di un daemon 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 Treble introdotto anche in Android 8.0, tutte le HAL sono isolate dai servizi di sistema e devono essere eseguite nei propri daemon nativi. In questo modo non è più necessario disporre di un daemon USB esclusivo, in quanto il livello HAL funge anche da daemon USB.
L'implementazione HAL predefinita gestisce tutti i dispositivi precedenti ad Android 8.0. Pertanto, non ci sarebbero lavori specifici per i dispositivi precedenti ad Android 8.0. Android 8.0 utilizza l'interfaccia HAL per eseguire query sullo stato delle porte USB ed eseguire scambi di ruoli di dati e di alimentazione.
Implementazione
La nuova interfaccia USB HAL deve essere implementata su ogni dispositivo lanciato su Android 8.0.
L'implementazione predefinita dovrebbe gestire i 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 banali negli script USB specifici del dispositivo
per trasferire la proprietà dei nodi di tipo C al sistema.