Convertire i moduli HAL

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

Utilizza 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 di hardware/interfaces/update-makefiles.sh dalla directory $ANDROID_BUILD_TOP aggiunge anche il makefile richiesto all'HAL. Da qui puoi apportare modifiche manuali per convertire completamente il livello di astrazione hardware.

c2hal activities

Quando esegui c2hal, tutto ciò che è presente nel file di intestazione viene trasferito ai file .hal.

c2hal identifica le struct che contengono puntatori a funzioni nel file di intestazione fornito e converte ogni struct 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 con il simbolo # vengono spostate negli enum e gli elementi che non fanno parte di HIDL o non sono 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 rileva determinati costrutti. Ad esempio, HIDL non ha il concetto di puntatori non elaborati; per questo motivo, quando c2hal rileva un puntatore nei file di intestazione, non sa se il puntatore deve essere interpretato come un array o come riferimento a un altro oggetto. Anche i puntatori vuoti sono opachi.

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

Implementa l'HAL

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

Quando i makefile sono aggiornati, puoi generare i file di intestazione e implementare i metodi. Per informazioni dettagliate sull'implementazione dell'interfaccia generata, consulta HIDL C++ (per le implementazioni C++) o HIDL Java (per le implementazioni Java).