В смартфонах есть несколько процессоров, каждый из которых оптимизирован для выполнения определенных задач. Однако Android работает только на одном процессоре – процессоре приложений (AP). Процессор приложений настроен на обеспечение высокой производительности при включенном экране, например во время игр, но он потребляет слишком много энергии для поддержки функций, требующих частых коротких всплесков обработки данных, даже когда экран выключен. Меньшие процессоры способны более эффективно справляться с такими рабочими нагрузками, выполняя свои задачи без заметного влияния на время автономной работы. Однако программные среды в таких процессорах более ограничены и могут сильно различаться, что затрудняет разработку для разных платформ.
Среда выполнения Context Hub (CHRE) – это общая платформа для запуска приложений на процессоре с низким энергопотреблением, которая использует простой стандартизированный API, подходящий для встраиваемых систем. CHRE позволяет OEM-производителям устройств и их доверенным партнерам переносить обработку данных с процессора приложений, чтобы экономить заряд батареи, улучшать удобство использования и включать постоянно работающие контекстные функции, особенно те, которые связаны с применением машинного обучения к датчикам окружающей среды.
Основные понятия
CHRE – это программная среда, в которой небольшие нативные приложения, называемые наноприложениями, выполняются на процессоре с низким энергопотреблением и взаимодействуют с базовой системой через общий CHRE API. Чтобы ускорить правильную реализацию API CHRE, в AOSP включена кроссплатформенная эталонная реализация CHRE. Эталонная реализация включает общий код и абстракции для базового аппаратного и программного обеспечения через ряд уровней абстракции платформы (PAL). Наноприложения почти всегда связаны с одним или несколькими клиентскими приложениями, работающими в Android. Они взаимодействуют с CHRE и наноприложениями через системные API ContextHubManager с ограниченным доступом.
В целом можно провести параллели между архитектурой CHRE и Android. Однако есть несколько важных различий:
- CHRE поддерживает только наноприложения, разработанные на нативном коде (C или C++). Java не поддерживается.
- Из-за ограничений ресурсов и безопасности CHRE нельзя использовать в любых сторонних приложениях для Android. Доступ к нему имеют только системные приложения.
Важно также понимать разницу между CHRE и концентратором датчиков. Хотя для реализации концентратора датчиков и CHRE часто используется одно и то же оборудование, сама CHRE не предоставляет возможности датчиков, необходимые для Android Sensors HAL. CHRE связана с HAL-уровнем Context Hub и выступает в качестве клиента фреймворка датчиков устройства, чтобы получать данные датчиков без участия процессора приложений.
Рисунок 1. Архитектура CHRE
HAL Context Hub
Уровень аппаратной абстракции (HAL) Context Hub – это интерфейс между фреймворком Android и реализацией CHRE на устройстве, определенный в файле hardware/interfaces/contexthub.
HAL Context Hub определяет API, с помощью которых фреймворк Android обнаруживает доступные концентраторы контекста и их наноприложения, взаимодействует с этими наноприложениями посредством передачи сообщений и позволяет загружать и выгружать наноприложения. Эталонная реализация HAL Context Hub, которая работает с эталонной реализацией CHRE, доступна на странице system/chre/host.
В случае противоречий между этой документацией и определением HAL приоритет имеет определение HAL.
Инициализация
При загрузке Android ContextHubService вызывает функцию HAL getHubs(), чтобы определить, доступны ли на устройстве какие-либо центры контекста. Это блокирующий однократный вызов, поэтому он должен быстро завершиться, чтобы не задерживать загрузку, и вернуть точный результат, поскольку после этого новые контекстные хабы добавлять нельзя.
Как загружать и выгружать наноприложения
Контекстный концентратор может включать набор наноприложений, которые входят в образ устройства и загружаются при запуске CHRE. Они называются предварительно загруженными наноприложениями и должны быть включены в первый возможный ответ на queryApps().
HAL Context Hub также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью функций loadNanoApp() и unloadNanoApp(). Наноприложения предоставляются HAL в двоичном формате, специфичном для аппаратной и программной реализации CHRE устройства.
Если для загрузки наноприложения требуется записать его в энергонезависимую память, например флеш-память, подключенную к процессору, на котором работает CHRE, то при запуске CHRE эти динамические наноприложения всегда должны быть отключены. Это означает, что код наноприложения не выполняется, пока через HAL не будет получен запрос enableNanoapp(). Предустановленные наноприложения могут инициализироваться во включенном состоянии.
Перезапуски Context Hub
CHRE не должна перезапускаться во время нормальной работы, но это может потребоваться для восстановления после непредвиденных ситуаций, например попытки доступа к несопоставленному адресу памяти. В таких случаях CHRE перезапускается независимо от Android. HAL уведомляет Android об этом с помощью события RESTARTED, которое должно отправляться только после того, как CHRE будет повторно инициализирован до состояния, в котором он может принимать новые запросы, например queryApps().
Обзор системы CHRE
CHRE разработана на основе событийно-ориентированной архитектуры, в которой основной единицей вычислений является событие, передаваемое в точку входа обработки событий наноприложения. Хотя фреймворк CHRE может быть многопоточным, наноприложение никогда не выполняется из нескольких потоков параллельно. Платформа CHRE взаимодействует с наноприложением через одну из трех точек входа (nanoappStart(), nanoappHandleEvent() и nanoappEnd()) или через обратный вызов, предоставленный в предыдущем вызове API CHRE. Наноприложения взаимодействуют с платформой CHRE и базовой системой через CHRE API. CHRE API предоставляет набор базовых возможностей, а также средства для доступа к контекстным сигналам, включая датчики, GNSS, Wi-Fi, WWAN и аудио. Его можно расширить, добавив дополнительные возможности, относящиеся к определенному поставщику, для использования в наноприложениях этого поставщика.
Система сборки
Хотя HAL-модуль Context Hub и другие необходимые компоненты на стороне процессора приложений создаются вместе с Android, код, который выполняется в CHRE, может иметь требования, делающие его несовместимым с системой сборки Android, например необходимость в специализированном тулчейне. Поэтому проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции наноприложений и, при необходимости, фреймворка CHRE в библиотеки, которые можно интегрировать с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
API CHRE написан на языке C99, а в эталонной реализации используется ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.
CHRE API
CHRE API – это набор заголовочных файлов C, которые определяют программный интерфейс между наноприложением и системой. Она позволяет создавать код наноприложений, совместимый со всеми устройствами, поддерживающими CHRE. Это означает, что исходный код наноприложения не нужно изменять, чтобы оно работало на новом типе устройств. Однако может потребоваться перекомпилировать его для системы команд процессора или двоичного интерфейса приложения (ABI) целевого устройства. Архитектура CHRE и дизайн API также обеспечивают бинарную совместимость наноприложений с разными версиями CHRE API. Это означает, что наноприложение не нужно перекомпилировать для запуска в системе, в которой реализована версия CHRE API, отличная от целевой версии API, для которой скомпилировано наноприложение. Другими словами, если исполняемый файл наноприложения работает на устройстве, поддерживающем CHRE API версии 1.3, и это устройство обновлено для поддержки CHRE API версии 1.4, тот же исполняемый файл наноприложения продолжает работать. Аналогично, наноприложение может работать с CHRE API версии 1.2 и определять во время выполнения, нужны ли ему возможности API версии 1.3 для достижения своей цели или оно может работать, возможно, с постепенным ухудшением функций.
Новые версии CHRE API выпускаются вместе с Android, но поскольку реализация CHRE является частью реализации поставщика, версия CHRE API, поддерживаемая на устройстве, не обязательно связана с версией Android.
Сведения о версии
Как и схема управления версиями HIDL для Android, CHRE API следует семантическому управлению версиями.
Основная версия указывает на совместимость двоичных файлов, а промежуточная версия увеличивается при добавлении функций, совместимых с предыдущими версиями. В CHRE API есть аннотации исходного кода, которые позволяют определить, в какой версии появилась функция или параметр, например @since v1.1.
Реализация CHRE также предоставляет доступ к версии исправления для определенной платформы через chreGetVersion(), которая указывает, когда в реализацию были внесены исправления ошибок или незначительные обновления.
Краткое описание каждой версии приведено в статье version.h.
Обязательные системные функции
Источники контекстных сигналов, например датчики, относятся к необязательным функциям, но некоторые основные функции требуются для всех реализаций CHRE. К ним относятся основные системные API, например для настройки таймеров, отправки и получения сообщений клиентам в процессоре приложений, ведения журналов и т. д. Подробную информацию можно найти в разделе Заголовки API.
Помимо основных системных функций, описанных в CHRE API, существуют также обязательные системные функции CHRE, заданные на уровне HAL Context Hub. Наиболее важной из них является возможность динамической загрузки и выгрузки наноприложений.
Стандартная библиотека C/C++
Чтобы свести к минимуму использование памяти и сложность системы, реализации CHRE должны поддерживать только подмножество стандартных библиотек C и C++ и языковых функций, требующих поддержки во время выполнения. В соответствии с этими принципами некоторые функции были исключены из-за их требований к памяти и обширных зависимостей от ОС, а другие – потому что их заменили более подходящие API CHRE. Ниже приведен неполный список возможностей, которые не должны быть доступны наноприложениям:
- Исключения C++ и информация о типе во время выполнения (RTTI)
- Поддержка многопоточности в стандартной библиотеке, включая заголовки C++11:
<thread>,<mutex>,<atomic>,<future>. - Стандартные библиотеки ввода-вывода C и C++
- Стандартная библиотека шаблонов C++ (STL)
- Стандартная библиотека регулярных выражений C++
- Динамическое выделение памяти с помощью стандартных функций (например,
malloc,calloc,realloc,free,operator new) и других стандартных функций библиотеки, которые по своей природе используют динамическое выделение, напримерstd::unique_ptr. - Поддержка локализации и символов Unicode
- Библиотеки для работы с датой и временем
- Функции, которые изменяют обычный ход программы, в том числе
<setjmp.h>,<signal.h>,abort,std::terminate - Доступ к среде хоста, включая
system,getenv - POSIX и другие библиотеки, не включенные в стандарты языков C99 или C++11
Во многих случаях аналогичные возможности доступны в функциях CHRE API и вспомогательных библиотеках. Например, chreLog можно использовать для журнала отладки, предназначенного для системы Android Logcat, тогда как в более традиционной программе для этого могут использоваться printf или std::cout.
Однако некоторые возможности стандартной библиотеки необходимы. Платформа может предоставлять эти функции через статические библиотеки, которые можно включить в бинарный файл наноприложения, или с помощью динамической связи между наноприложением и системой. Вот некоторые примеры:
- Утилиты для работы со строками и массивами:
memcmp,memcpy,memmove,memset,strlen. Математическая библиотека. Часто используемые функции с плавающей запятой одинарной точности:
- Основные операции:
ceilf,fabsf,floorf,fmaxf,fminf,fmodf,roundf,lroundf,remainderf. - Показательные и степенные функции:
expf,log2f,powf,sqrtf - Тригонометрические и гиперболические функции:
sinf,cosf,tanf,asinf,acosf,atan2f,tanhf.
- Основные операции:
Несмотря на то что некоторые платформы поддерживают дополнительные возможности, наноприложение не считается переносимым между реализациями CHRE, если оно не ограничивает свои внешние зависимости функциями CHRE API и одобренными функциями стандартной библиотеки.
Дополнительные функции
Чтобы продвигать аппаратное и программное обеспечение, CHRE API разделен на области функций, которые считаются необязательными с точки зрения API. Эти функции могут быть не нужны для поддержки совместимой реализации CHRE, но могут потребоваться для поддержки определенного наноприложения. Даже если платформа не поддерживает определенный набор API, наноприложения, которые ссылаются на эти функции, должны быть доступны для сборки и загрузки.
Датчики
CHRE API позволяет запрашивать данные у датчиков, в том числе акселерометра, гироскопа, магнитометра, датчика освещенности и датчика приближения. Эти API предоставляют набор функций, аналогичный Android Sensors API, включая поддержку пакетной обработки данных датчиков для снижения энергопотребления. Обработка данных датчиков в CHRE позволяет значительно снизить энергопотребление и задержку при обработке сигналов движения по сравнению с запуском на процессоре приложений.
ГНСС
CHRE предоставляет API для запроса данных о местоположении у глобальной навигационной спутниковой системы (GNSS), в том числе GPS и других спутниковых группировок. Это включает запросы на периодическое определение местоположения, а также необработанные данные измерений, хотя обе эти возможности независимы. Поскольку CHRE напрямую связана с подсистемой GNSS, энергопотребление снижается по сравнению с запросами GNSS на основе процессора приложений, так как процессор приложений может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.
Wi-Fi
CHRE позволяет взаимодействовать с чипом Wi-Fi, в основном для определения местоположения. Хотя GNSS хорошо работает на открытом воздухе, результаты сканирования Wi-Fi могут предоставить точные геоданные в помещении и в застроенных районах. Помимо того, что CHRE не нужно активировать процессор приложений для сканирования, эта среда может получать результаты сканирования сетей Wi-Fi, выполняемого встроенным ПО Wi-Fi для подключения. Обычно эти результаты не передаются процессору приложений в целях экономии энергии. Использование сканирования подключения в контекстных целях помогает сократить общее количество сканирований Wi-Fi и экономить энергию.
Поддержка Wi-Fi была добавлена в CHRE API версии 1.1, в том числе возможность отслеживать результаты сканирования и запускать сканирование по запросу. В версии 1.2 эти возможности были расширены за счет функции измерения времени прохождения сигнала (RTT) для точек доступа, поддерживающих эту функцию, что позволяет точно определять относительное позиционирование.
WWAN
CHRE API позволяет получать идентификационную информацию об обслуживающей соте и соседних сотах, которая обычно используется для приблизительного определения местоположения.
Аудио
CHRE может обрабатывать пакеты аудиоданных с микрофона с низким энергопотреблением, который обычно использует оборудование, применяемое для реализации HAL SoundTrigger. Обработка аудиоданных в CHRE позволяет объединять их с другими данными, например с датчиков движения.
Bluetooth
CHRE предоставляет API, поддерживающие некоторые функции Bluetooth, которые выигрывают от разгрузки с низким энергопотреблением. CHRE позволяет наноприложениям выполнять сканирование BLE, отслеживать RSSI и обрабатывать данные рекламы BLE, не активируя процессор приложений. Кроме того, право собственности на установленное подключение Bluetooth можно передать в домен разгрузки, что требует меньше энергии для обслуживания и позволяет наноприложениям обмениваться данными через разгруженное подключение BLE.
Пример реализации
Справочный код для фреймворка CHRE включен в AOSP в проекте system/chre и реализован на C++11. Хотя это и не обязательно, мы рекомендуем использовать эту базу кода для всех реализаций CHRE, чтобы обеспечить согласованность и ускорить внедрение новых возможностей. Этот код можно рассматривать как аналог основной платформы Android, поскольку он представляет собой реализацию API с открытым исходным кодом, которые используются приложениями и служат базой и стандартом для обеспечения совместимости. Хотя его можно настраивать и расширять с помощью функций, относящихся к определенному поставщику, мы рекомендуем поддерживать общий код как можно ближе к эталонному. Как и в случае с HAL Android, в эталонной реализации CHRE используются различные абстракции платформы, чтобы ее можно было адаптировать к любому устройству, отвечающему минимальным требованиям.
Технические подробности и руководство по переносу можно найти в файле README, который входит в проект system/chre.