Вы можете обновить существующие модули HAL до модулей HIDL HAL, преобразовав заголовок в hardware/libhardware/include/hardware
.
Использовать c2hal
Инструмент c2hal
берёт на себя большую часть работы по конвертации, сокращая количество необходимых ручных изменений. Например, чтобы создать файл HIDL .hal
для 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
Эти команды добавляют файлы в hardware/interfaces/nfc/1.0/
. Запуск hardware/interfaces/update-makefiles.sh
из каталога $ANDROID_BUILD_TOP
также добавляет необходимый make-файл в HAL. Здесь вы можете вручную внести изменения для полной конвертации HAL.
деятельность c2hal
При запуске c2hal
все содержимое заголовочного файла переносится в файлы .hal
.
c2hal
идентифицирует структуры, содержащие указатели на функции, в предоставленном заголовочном файле и преобразует каждую структуру в отдельный файл интерфейса. Например, alloc_device_t
преобразуется в модуль HAL IAllocDevice
(в файле IAllocDevice.hal
).
Все остальные типы данных копируются в файл types.hal
. Определения со знаком "решётка" переносятся в перечисления, а элементы, не являющиеся частью HIDL или не подлежащие преобразованию (например, объявления статических функций), копируются в комментарии, помеченные текстом " NOTE
".
Ручная деятельность
Инструмент c2hal
не знает, что делать при обнаружении определённых конструкций. Например, в HIDL нет концепции «сырых» указателей; поэтому, когда c2hal
встречает указатель в заголовочных файлах, он не знает, следует ли интерпретировать его как массив или как ссылку на другой объект. Указатели типа «пустой» также непрозрачны.
При переходе на HIDL необходимо вручную удалить поле, например, int reserved[7]
. Такие элементы, как имя возвращаемого значения, следует обновить, сделав их более осмысленными. Например, можно преобразовать возвращаемый параметр методов, таких как write
в NFC, из автоматически сгенерированного int32_t write_ret
в Status status
(где Status
— это новое перечисление, содержащее возможные статусы NFC).
Реализовать HAL
После создания файлов .hal
для представления вашего HAL необходимо сгенерировать make-файлы (Make или Soong), обеспечивающие поддержку языка в C++ и Java (если только HAL не использует функцию, не поддерживаемую в Java). Скрипт ./hardware/interfaces/update-makefiles.sh
может автоматически генерировать make-файлы для HAL, расположенных в каталоге hardware/interfaces
(для HAL в других местах просто обновите скрипт).
После обновления make-файлов вы готовы к генерации заголовочных файлов и реализации методов. Подробнее о реализации сгенерированного интерфейса см. в разделах HIDL C++ (для реализаций на C++) и HIDL Java (для реализаций на Java).