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