Преобразование модулей 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 преобразуется в модуль IAllocDevice HAL (в файле 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, вы должны сгенерировать файлы makefile (Make или Soong), которые создают языковую поддержку в C++ и Java (если только HAL не использует функцию, не поддерживаемую в Java). Скрипт ./hardware/interfaces/update-makefiles.sh может автоматически генерировать файлы makefile для HAL, расположенных в каталоге hardware/interfaces (для HAL в других местах просто обновите скрипт).

Когда файлы make-файлов обновлены, вы готовы создавать файлы заголовков и реализовывать методы. Подробные сведения о реализации сгенерированного интерфейса см. в разделе HIDL C++ (для реализаций C++) или HIDL Java (для реализаций Java).