Преобразование модулей HAL

Вы можете обновить существующие модули 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 встречает указатель в заголовочных файлах, он не знает, следует ли интерпретировать указатель как массив или как ссылку на другой объект. Пустые указатели также непрозрачны.

Поле типа int reserved[7] должно быть удалено вручную при переходе на HIDL. Такие элементы, как имя возвращаемого значения, должны быть обновлены до чего-то более осмысленного; например, преобразование возвращаемого параметра таких методов, как 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).