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).