Вы можете обновить существующие модули 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 в HAL также добавляется необходимый make-файл. Здесь вы можете вручную внести изменения, чтобы полностью преобразовать HAL.
Действия C2HAL
Когда вы запускаете c2hal, все данные из заголовочного файла переносятся в файлы .hal.
c2hal определяет структуры, содержащие указатели на функции, в предоставленном заголовочном файле и преобразует каждую структуру в отдельный файл интерфейса.
Например, alloc_device_t преобразуется в модуль HAL IAllocDevice (в файле IAllocDevice.hal).
Все остальные типы данных копируются в файл types.hal.
Определения pound-defines перемещаются в перечисления, а элементы, не являющиеся частью HIDL или не подлежащие преобразованию (например, объявления статических функций), копируются в комментарии, помеченные текстом "NOTE".
Записываемые вручную активности
Инструмент c2hal не знает, что делать, когда встречает определенные конструкции. Например, в HIDL нет такого понятия, как необработанный указатель. Поэтому, когда c2hal обнаруживает указатель в файлах заголовков, он не знает, следует ли интерпретировать его как массив или как ссылку на другой объект. Указатели void также являются непрозрачными.
Поля, такие как 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 может автоматически создавать файлы makefile для HAL, расположенных в каталоге hardware/interfaces (для HAL в других местах просто обновите скрипт).
После обновления make-файлов можно сгенерировать заголовочные файлы и реализовать методы. Подробнее о реализации сгенерированного интерфейса рассказывается в HIDL C++ (для реализаций на C++) и HIDL Java (для реализаций на Java).