Convertire i moduli HAL

Puoi aggiornare i moduli HAL esistenti in moduli HAL HIDL convertendo l'header in hardware/libhardware/include/hardware.

Utilizza c2hal

Lo strumentoc2hal 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'NFC HAL:

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 file makefile richiesto all'HAL. Da qui puoi apportare modifiche manuali per convertire completamente l'HAL.

Attività c2hal

Quando esegui c2hal, tutto il contenuto del file di intestazione viene trasferito ai file .hal.

c2hal identifica le strutture che contengono puntatori di funzione nel file di intestazione fornito e converte ogni 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 di pound 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 dal testo "NOTE".

Attività manuali

Lo strumento c2hal non sa cosa fare quando incontra 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 deve essere interpretato come un array o come un riferimento a un altro oggetto. Anche i puntatori null sono simili.

I campi come int reserved[7] devono essere rimossi manualmente durante la transizione a HIDL. Elementi come il nome del valore restituito devono essere aggiornati a qualcosa di più significativo; ad esempio, la conversione del parametro di ritorno di metodi come write in NFC dal valore generato automaticamente int32_t write_ret a Status status (dove Status è un nuovo enum contenente i possibili stati NFC).

Implementa l'HAL

Dopo aver creato i file .hal per rappresentare l'HAL, devi generare i file make (Make o Soong) che creano il supporto del linguaggio 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 file make per gli HAL nella directory hardware/interfaces (per gli HAL in altre posizioni, è sufficiente aggiornare lo script).

Quando i file make 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).