Sensors Multi-HAL — это платформа, которая позволяет HAL датчиков работать вместе с HAL других датчиков. Sensors Multi-HAL динамически загружает суб-HAL датчиков, хранящиеся в виде динамических библиотек в разделе поставщика, и предоставляет им объект обратного вызова, который может обрабатывать события публикации, а также получать и снимать блокировку пробуждения. Sub-HAL датчиков — это HAL датчиков, встроенный в общий объект в разделе поставщика и используемый инфраструктурой с несколькими HAL. Эти подчиненные HAL не зависят друг от друга или от кода multi-HAL, содержащего основную функцию процесса.
Sensors Multi-HAL 2.1, доступный на устройствах под управлением Android 11 или более поздней версии, представляет собой итерацию Sensors Multi-HAL 2.0, которая поддерживает загрузку суб-HAL, которые могут отображать тип датчика угла поворота . Для поддержки этого типа датчика суб-HAL должны использовать API-интерфейсы суб-HAL, определенные в заголовке 2.1 SubHal .
Разница между датчиками Multi-HAL 2 и датчиками HAL 2
Sensors Multi-HAL 2, доступный на устройствах под управлением Android 10 или более поздней версии, представляет несколько абстракций поверх Sensors HAL 2 , чтобы упростить взаимодействие с HAL API. Sensors Multi-HAL 2 представляет класс HalProxy для обработки реализации интерфейса Sensors HAL 2 и интерфейса V2_1/SubHal
(или V2_0/SubHal
), позволяющего HalProxy
взаимодействовать с суб-HAL.
Интерфейс ISensorsSubHal
отличается от интерфейса 2.1/ISensors.hal
(или 2.0/ISensors.hal
) следующими способами:
- Метод initialize передает класс
IHalProxyCallback
вместо двух FMQ иISensorsCallback
. - Sub-HAL должны реализовать функцию отладки для предоставления отладочной информации в отчетах об ошибках.
- Sub-HAL должны реализовывать функцию имени, чтобы загруженный sub-HAL можно было отличить от других sub-HAL.
Основное различие между датчиками Multi-HAL 2 и датчиками HAL 2 заключается в функциях инициализации. Вместо предоставления IHalProxyCallback
интерфейс IHalProxyCallback предоставляет два метода: один метод для отправки событий датчиков в платформу датчиков и один метод для создания блокировок пробуждения. Под капотом Sensors Multi-HAL управляет всеми взаимодействиями с FMQ, чтобы обеспечить своевременную доставку событий датчиков для всех суб-HAL. Настоятельно рекомендуется, чтобы суб-HAL использовали метод createScopedWakelock
, чтобы делегировать бремя тайм-аута блокировок пробуждения Multi-HAL датчиков и централизовать использование блокировки пробуждения одной общей блокировке пробуждения для всего Multi-HAL датчиков, что сводит к минимуму блокировку и разблокировку. звонки.
Датчики Multi-HAL 2 также имеют некоторые встроенные функции безопасности. Он обрабатывает ситуации, когда FMQ датчика заполнен или когда платформа датчиков Android перезапускается, и состояние датчика необходимо сбросить. Кроме того, когда события отправляются в класс HalProxy
, но структура датчика не может принять события немедленно, Multi-HAL датчиков может переместить события в фоновый поток, чтобы позволить продолжить работу во всех суб-HAL в ожидании событий. быть размещенным.
Исходный код и эталонная реализация
Код Multi-HAL для всех датчиков доступен в hardware/interfaces/sensors/common/default/2.X/multihal/
. Вот указатели на некоторые ресурсы.
-
HalProxy.h
: объектHalProxy
датчиками multi-HAL и обрабатывает передачу данных из подчиненных HAL в структуру датчиков. -
HalProxy.cpp
: реализацияHalProxy
содержит всю логику, необходимую для мультиплексной связи между суб-HAL и инфраструктурой датчиков. SubHal.h
: интерфейсISensorsSubHal
определяет интерфейс, которому должны следовать подчиненные HAL, чтобы быть совместимыми сHalProxy
. Sub-HAL реализует метод инициализации, чтобы объектHalProxyCallback
можно было использовать дляpostEvents
иcreateScopedWakelock
.Для реализаций Multi-HAL 2.0 используйте
SubHal.h
версии 2.0.hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: Эти модульные тесты проверяют реализациюHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: в этом примере реализация sub-HAL использует поддельные датчики для генерации поддельных данных. Полезно для тестирования того, как несколько суб-HAL взаимодействуют на устройстве.
Реализация
В этом разделе описывается, как реализовать датчики Multi-HAL в следующих ситуациях:
- Внедрение сенсоров Multi-HAL 2.1
- Перенос датчиков Multi-HAL 2.0 на Multi-HAL 2.1
- Портирование с Sensors HAL 2.0
- Портирование с Sensors HAL 1.0
- Портирование с Sensors Multi-HAL 1.0
Внедрение сенсоров Multi-HAL 2.1
Чтобы реализовать Sensors Multi-HAL 2.1 на новом устройстве, выполните следующие действия:
-
ISensorsSubHal
интерфейс ISensorsSubHal, как описано вSubHal.h
. -
sensorsHalGetSubHal_2_1
метод sensorHalGetSubHal_2_1 вSubHal.h
. Добавьте цель
cc_library_shared
для создания недавно реализованного sub-HAL. При добавлении цели:- Убедитесь, что цель перенесена куда-нибудь в раздел поставщика устройства.
- В файле конфигурации, расположенном по адресу
/vendor/etc/sensors/hals.conf
, добавьте путь к библиотеке с новой строки. При необходимости создайте файлhals.conf
.
Пример записи
Android.bp
для создания библиотеки sub-HAL см. в разделеhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
.Удалите все записи
android.hardware.sensors
из файлаmanifest.xml
, который содержит список поддерживаемых HAL на устройстве.Удалите все файлы
android.hardware.sensors
service иservice.rc
из файлаdevice.mk
и добавьтеandroid.hardware.sensors@2.1-service.multihal
иandroid.hardware.sensors@2.1-service.multihal.rc
вPRODUCT_PACKAGES
.
При загрузке HalProxy
запускается, ищет недавно реализованный sub-HAL и инициализирует его, вызывая sensorsHalGetSubHal_2_1
.
Перенос датчиков Multi-HAL 2.0 на Multi-HAL 2.1
Для переноса с Multi-HAL 2.0 на Multi-HAL 2.1 реализуйте интерфейс SubHal
и перекомпилируйте свой sub-HAL.
Вот различия между интерфейсами SubHal
2.0 и 2.1:
-
IHalProxyCallback
использует типы, созданные в версии 2.1ISensors.hal
. - Функция
initialize()
передает новыйIHalProxyCallback
вместо того, что был в интерфейсе 2.0SubHal
- Sub-HAL должны реализовывать
getSensorsList_2_1
иinjectSensorData_2_1
вместоgetSensorsList
иinjectSensorData
, поскольку эти методы используют новые типы, добавленные в версии 2.1 спецификацииISensors.hal
. - Sub-HAL должны выставлять
sensorsHalGetSubHal_2_1
, а неsensorsHalGetSubHal
, чтобы Multi-HAL обрабатывал их как sub-HAL версии 2.1.
Портирование с Sensors HAL 2.0
При обновлении до Sensors Multi-HAL 2.0 с Sensors HAL 2.0 убедитесь, что реализация HAL соответствует следующим требованиям.
Инициализация HAL
Датчики HAL 2.0 имеет функцию инициализации, которая позволяет службе датчиков передавать FMQ и динамический обратный вызов датчика. В Sensors Multi-HAL 2.0 функция initialize()
передает один обратный вызов, который необходимо использовать для публикации событий датчика, получения блокировок пробуждения и уведомления о динамическом подключении и отключении датчика.
Публикация событий датчиков в реализации Multi-HAL
Вместо того, чтобы отправлять события датчика через FMQ, суб-HAL должен записывать события датчика в IHalProxyCallback
, когда события датчика доступны.
События WAKE_UP
В Sensors HAL 2.0 HAL может управлять блокировкой пробуждения для своей реализации. В Sensors Multi-HAL 2.0 под-HAL позволяют реализации Multi-HAL управлять блокировками пробуждения и могут запрашивать блокировку пробуждения, вызывая createScopedWakelock
. Заблокированная блокировка пробуждения с заданной областью должна быть получена и передана в postEvents
при отправке событий пробуждения в реализацию Multi-HAL.
Динамические датчики
Сенсоры Multi-HAL 2.0 требует, чтобы onDynamicSensorsConnected
и onDynamicSensorsDisconnected
в IHalProxyCallback
вызывались при каждом изменении подключения динамического датчика. Эти обратные вызовы доступны как часть указателя IHalProxyCallback
, который предоставляется через функцию initialize()
.
Портирование с Sensors HAL 1.0
При обновлении до Sensors Multi-HAL 2.0 с Sensors HAL 1.0 убедитесь, что реализация HAL соответствует следующим требованиям.
Инициализация HAL
Функция initialize()
должна поддерживаться для установления обратного вызова между суб-HAL и реализацией Multi-HAL.
Отображение доступных датчиков
В Sensors Multi-HAL 2.0 getSensorsList()
должна возвращать одно и то же значение во время загрузки одного устройства, даже при перезапуске HAL датчиков. Это позволяет платформе попытаться восстановить соединения датчиков, если системный сервер перезапустится. Значение, возвращаемое getSensorsList()
, может измениться после перезагрузки устройства.
Публикация событий датчиков в реализации Multi-HAL
В Sensors HAL 2.0 вместо ожидания вызова poll()
суб-HAL должен заблаговременно записывать события датчика в IHalProxyCallback
всякий раз, когда доступны события датчика.
События WAKE_UP
В Sensors HAL 1.0 HAL может управлять блокировкой пробуждения для своей реализации. В Sensors Multi-HAL 2.0 суб-HAL позволяют реализации Multi-HAL управлять блокировками пробуждения и могут запрашивать блокировку пробуждения, вызывая createScopedWakelock
. Заблокированная блокировка пробуждения с заданной областью должна быть получена и передана в postEvents
при отправке событий пробуждения в реализацию Multi-HAL.
Динамические датчики
В Sensors HAL 1.0 динамические датчики возвращаются через функцию poll()
. Сенсоры Multi-HAL 2.0 требует, чтобы onDynamicSensorsConnected
и onDynamicSensorsDisconnected
в IHalProxyCallback
вызывались при каждом изменении подключения динамического датчика. Эти обратные вызовы доступны как часть указателя IHalProxyCallback
, который предоставляется через функцию initialize()
.
Портирование с Sensors Multi-HAL 1.0
Чтобы перенести существующую реализацию из Sensors Multi-HAL 1.0 , выполните следующие действия.
- Убедитесь, что конфигурация HAL датчиков находится в
/vendor/etc/sensors/hals.conf.
Это может потребовать перемещения файла, расположенного в/system/etc/sensors/hals.conf
. - Удалите любые ссылки на
hardware/hardware.h
иhardware/sensors.h
, так как они не поддерживаются для HAL 2.0. - Перенесите суб-HAL, как описано в разделе « Перенос с датчиков Hal 1.0 ».
- Установите датчики Multi-HAL 2.0 в качестве назначенного HAL, выполнив шаги 3 и 4 в разделе « Реализация датчиков Mutli-HAL 2.0 ».
Проверка
Запуск СУДС
Когда вы интегрировали один или несколько суб-HAL с Sensors Multi-Hal 2.1, используйте Vendor Test Suite (VTS) , чтобы убедиться, что ваши реализации sub-HAL соответствуют всем требованиям, установленным интерфейсом Sensors HAL.
Чтобы запустить только тесты датчиков VTS, когда VTS настроен на хост-компьютере, выполните следующие команды:
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_0Target && \
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_1Target
Запуск модульных тестов
Модульные тесты в HalProxy_test.cpp
проверяют HalProxy
с использованием поддельных суб-HAL, которые создаются в модульном тесте и не загружаются динамически. При создании нового суб-HAL эти тесты должны служить руководством по добавлению модульных тестов, которые проверяют правильность реализации нового суб-HAL.
Для запуска тестов выполните следующие команды:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
Тестирование с поддельными sub-HAL
Фальшивые суб-HAL — это фиктивные реализации интерфейса ISensorsSubHal
. Вложенные HAL предоставляют различные списки датчиков. Когда датчики активированы, они периодически отправляют автоматически сгенерированные события датчика в HalProxy
на основе интервалов, указанных в заданном запросе датчика.
Фальшивые суб-HAL можно использовать для проверки того, как полный код Multi-HAL работает с другими суб-HAL, загруженными в систему, а также для проверки различных аспектов кода сенсоров Multi-HAL.
Два поддельных sub-HAL доступны по адресу hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
.
Чтобы создать и отправить поддельные суб-HAL на устройство, выполните следующие действия:
Выполните следующие команды, чтобы создать и отправить на устройство три разных фальшивых суб-HAL:
$ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
mma
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
Обновите конфигурацию HAL датчиков в
/vendor/etc/sensors/hals.conf
, указав пути для поддельных суб-HAL./vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
Перезапустите
HalProxy
и загрузите новые суб-HAL, перечисленные в config.adb shell stop
adb shell start
Отладка
Разработчики могут отлаживать платформу с помощью команды lshal
. Чтобы запросить выходные данные отладки HAL датчиков, выполните следующую команду:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
Информация о текущем состоянии HalProxy
и его суб-HAL затем выводится на терминал. Ниже показан пример вывода команды для объекта HalProxy
и поддельных суб-HAL.
Internal values:
Threads are running: true
Wakelock timeout start time: 200 ms ago
Wakelock timeout reset time: 73208 ms ago
Wakelock ref count: 0
# of events on pending write queue: 0
# of non-dynamic sensors across all subhals: 8
# of dynamic sensors across all subhals: 0
SubHals (2):
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Если число, указанное для # of events on pending write queue
в платформу датчиков. Это указывает на то, что служба датчиков заблокирована или аварийно завершает работу и не обрабатывает события датчиков, или что из суб-HAL недавно был отправлен большой пакет событий датчиков.
Если счетчик ссылок на блокировку пробуждения больше 0
, это означает, что HalProxy
получил блокировку пробуждения. Это значение должно быть больше 0
только в том случае, если ScopedWakelock
намеренно или если события пробуждения были отправлены в HalProxy
и не были обработаны фреймворком сенсора.
Дескриптор файла, передаваемый методу отладки HalProxy
, передается каждому подчиненному HAL, поэтому разработчики должны реализовать метод отладки как часть интерфейса ISensorsSubHal
.