Conversione di moduli HAL

È possibile aggiornare i moduli HAL preesistenti in moduli HAL HIDL convertendo l'intestazione in hardware/libhardware/include/hardware .

Utilizzando c2hal

Lo strumento c2hal gestisce la maggior parte del lavoro di conversione, riducendo il numero di modifiche manuali richieste. Ad esempio, per generare un file HIDL .hal per l'HAL NFC:

make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h

Questi comandi aggiungono file in hardware/interfaces/nfc/1.0/ . L'esecuzione hardware/interfaces/update-makefiles.sh dalla directory $ANDROID_BUILD_TOP aggiungerà anche il makefile richiesto all'HAL. Da qui è possibile apportare modifiche manuali per convertire completamente l'HAL.

attività c2hal

Quando esegui c2hal , tutto nel file di intestazione viene trasferito nei file .hal .

c2hal identifica le strutture che contengono puntatori a funzione nel file di intestazione fornito e converte ciascuna struttura in un file di interfaccia separato. Ad esempio, alloc_device_t viene convertito nel modulo HAL IAllocDevice (nel file IAllocDevice.hal ).

Tutti gli altri tipi di dati vengono copiati in un file types.hal . Le definizioni cancelletto vengono spostate nelle enumerazioni e gli elementi che non fanno parte di HIDL o non convertibili (come le dichiarazioni di funzioni statiche) vengono copiati nei commenti contrassegnati con il testo " NOTE ".

Attività manuali

Lo strumento c2hal non sa cosa fare quando incontra determinati costrutti. Ad esempio, HIDL non prevede il concetto di puntatori grezzi; per questo motivo, quando c2hal incontra un puntatore nei file header, non sa se il puntatore deve essere interpretato come un array o come un riferimento a un altro oggetto. Anche i puntatori al vuoto sono altrettanto opachi.

Campo come int reserved[7] deve essere rimosso manualmente durante la transizione a HIDL. Elementi come il nome del valore restituito dovrebbero essere aggiornati con qualcosa di più significativo; ad esempio, convertendo il parametro di ritorno di metodi come write in NFC int32_t write_ret generato automaticamente allo Status status (dove Status è una nuova enumerazione contenente possibili stati NFC).

Implementazione dell'HAL

Dopo aver creato i file .hal per rappresentare il tuo HAL, devi generare i makefile (Make o Soong) che creano il supporto linguistico in C++ e Java (a meno che l'HAL utilizzi una funzionalità non supportata in Java). Lo script ./hardware/interfaces/update-makefiles.sh può generare automaticamente makefile per gli HAL situati nella directory hardware/interfaces (per gli HAL in altre posizioni, è sufficiente aggiornare lo script).

Quando i makefile sono aggiornati, sei pronto per generare file di intestazione e implementare metodi. Per dettagli sull'implementazione dell'interfaccia generata, vedere HIDL C++ (per implementazioni C++) o HIDL Java (per implementazioni Java).