Смартфоны оснащены несколькими процессорами, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). AP оптимизирован для обеспечения высокой производительности в сценариях использования с включенным экраном, таких как игры, но он слишком энергоёмок для поддержки функций, требующих частых, коротких всплесков обработки данных постоянно, даже при выключенном экране. Процессоры меньшего размера способны справляться с этими рабочими нагрузками более эффективно, выполняя свои задачи без заметного влияния на время работы аккумулятора. Однако программные среды в этих маломощных процессорах более ограничены и могут значительно различаться, что затрудняет кроссплатформенную разработку.
Среда выполнения Context Hub (CHRE) предоставляет общую платформу для запуска приложений на маломощном процессоре с простым, стандартизированным и удобным для встраиваемых систем API. CHRE позволяет производителям устройств и их доверенным партнерам легко разгрузить процессор от точки доступа, экономить заряд батареи и улучшать различные аспекты пользовательского опыта, а также предоставлять целый класс постоянно доступных контекстно-зависимых функций, особенно тех, которые связаны с применением машинного обучения к датчикам окружающей среды.
Ключевые концепции
CHRE — это программная среда, в которой небольшие нативные приложения, называемые наноприложениями (nanoapps) , выполняются на маломощном процессоре и взаимодействуют с базовой системой через общий API CHRE. Для ускорения корректной реализации API CHRE в AOSP включена кроссплатформенная эталонная реализация CHRE. Эта эталонная реализация включает в себя общий код и абстракции к базовому аппаратному и программному обеспечению посредством ряда уровней абстракции платформы (PAL). Наноприложения почти всегда привязаны к одному или нескольким клиентским приложениям , работающим на Android, которые взаимодействуют с CHRE и наноприложениями через системные API ContextHubManager
с ограниченным доступом.
На высоком уровне можно провести параллели между архитектурой CHRE и Android в целом. Однако есть несколько важных различий:
- CHRE поддерживает запуск только наноприложений, разработанных на машинном коде (C или C++); Java не поддерживается.
- Из-за ограничений ресурсов и безопасности CHRE недоступен для использования произвольными сторонними приложениями Android. Доступ к нему имеют только доверенные системные приложения.
Также следует провести важное различие между концепциями CHRE и концентратора датчиков. Хотя для реализации концентратора датчиков и CHRE обычно используется одно и то же аппаратное обеспечение, сам CHRE не предоставляет возможностей датчиков, требуемых HAL для сенсоров Android . CHRE привязан к HAL для контекстного концентратора и выступает в качестве клиента специфичной для устройства сенсорной платформы для получения данных датчиков без участия точки доступа.
Рисунок 1. Архитектура фреймворка CHRE
Контекстный концентратор HAL
Уровень аппаратной абстракции (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 также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью функций loadNanoApp()
и unloadNanoApp()
. Наноприложения предоставляются в HAL в двоичном формате, соответствующем аппаратной и программной реализации CHRE устройства.
Если реализация загрузки наноприложения предполагает его запись в энергонезависимую память, например, во флэш-накопитель, подключенный к процессору, на котором работает CHRE, то реализация CHRE всегда должна загружаться с этими динамическими наноприложениями в отключенном состоянии. Это означает, что никакой код наноприложения не будет выполнен до тех пор, пока не будет получен запрос enableNanoapp()
через HAL. Предварительно загруженные наноприложения могут инициализироваться во включенном состоянии.
Контекстный хаб перезапускается
Хотя CHRE не должен перезапускаться в процессе нормальной работы, может возникнуть необходимость в восстановлении после непредвиденных ситуаций, таких как попытка доступа к неотображённому адресу памяти. В таких ситуациях CHRE перезапускается независимо от Android. HAL уведомляет Android об этом через событие RESTARTED
, которое должно быть отправлено только после повторной инициализации CHRE до состояния, когда он может принимать новые запросы, например, queryApps()
.
Обзор системы CHRE
CHRE разработан на основе событийно-управляемой архитектуры, где основной единицей вычисления является событие, передаваемое в точку входа обработки событий наноприложения. Хотя фреймворк CHRE может быть многопоточным, одно наноприложение никогда не выполняется из нескольких потоков параллельно. Фреймворк CHRE взаимодействует с заданным наноприложением через одну из трёх точек входа наноприложения ( nanoappStart()
, nanoappHandleEvent()
и nanoappEnd()
) или через обратный вызов, предоставленный в предыдущем вызове API CHRE, а наноприложения взаимодействуют с фреймворком CHRE и базовой системой через API CHRE. API CHRE предоставляет набор базовых возможностей, а также средства для доступа к контекстным сигналам, включая датчики, ГНСС, Wi-Fi, WWAN и аудио, и может быть расширен дополнительными возможностями, специфичными для вендора, для использования в наноприложениях, специфичных для вендора.
Система сборки
Хотя Context Hub HAL и другие необходимые компоненты со стороны точки доступа собираются параллельно с Android, код, работающий в CHRE, может предъявлять требования, делающие его несовместимым с системой сборки Android, например, необходимость в специализированном наборе инструментов. Поэтому проект CHRE в AOSP предоставляет упрощённую систему сборки на основе GNU Make для компиляции наноприложений и, при необходимости, фреймворк CHRE в библиотеках, которые можно интегрировать с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки своих целевых устройств в AOSP.
API CHRE написан на стандарте языка C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.
API CHRE
API CHRE — это набор заголовочных файлов C, определяющих программный интерфейс между nanoapp и системой. Он разработан для обеспечения совместимости кода nanoapp на всех устройствах, поддерживающих CHRE. Это означает, что исходный код nanoapp не требует модификации для поддержки нового типа устройства, хотя может потребоваться его перекомпиляция специально для набора инструкций процессора или двоичного интерфейса приложения (ABI) целевого устройства. Архитектура CHRE и структура API также гарантируют двоичную совместимость nanoapp с различными версиями API CHRE. Это означает, что nanoapp не требует перекомпиляции для запуска в системе, реализующей версию API CHRE, отличную от целевой версии API, с которой скомпилировано nanoapp. Другими словами, если двоичный файл nanoapp запущен на устройстве с поддержкой API CHRE v1.3, и это устройство обновлено до поддержки API CHRE v1.4, тот же двоичный файл nanoapp продолжит функционировать. Аналогичным образом, nanoapp может работать на CHRE API v1.2 и может определять во время выполнения, требуются ли ему возможности API v1.3 для достижения его использования или оно может работать, возможно, с постепенной деградацией функций.
Новые версии API CHRE выпускаются вместе с Android, однако, поскольку реализация CHRE является частью реализации поставщика , версия API CHRE, поддерживаемая на устройстве, не обязательно связана с версией Android.
Сводка версий
Как и схема управления версиями Android HIDL , API CHRE следует семантическому управлению версиями . Основная версия указывает на бинарную совместимость, а дополнительная увеличивается при добавлении обратно совместимых функций. API CHRE включает аннотации исходного кода для указания версии, в которой появилась функция или параметр, например @since v1.1
.
Реализация CHRE также предоставляет версию исправления для конкретной платформы через chreGetVersion()
, которая указывает на исправление ошибок или внесение незначительных обновлений в реализацию.
Версия 1.0 (Android 7)
Включает поддержку датчиков и основных возможностей nanoapp, таких как события и таймеры.
Версия 1.1 (Android 8)
Включает возможности определения местоположения с помощью данных GNSS и необработанных измерений, сканирования Wi-Fi и информации о мобильных сетях, а также общие усовершенствования, обеспечивающие связь между наноприложениями, и другие улучшения.
Версия 1.2 (Android 9)
Добавляет поддержку данных с маломощного микрофона, определение дальности Wi-Fi RTT, уведомления о пробуждении и спящем режиме точки доступа и другие улучшения.
Версия 1.3 (Android 10)
Расширяет возможности, связанные с данными калибровки датчиков, добавляет поддержку очистки пакетных данных датчиков по требованию, определяет тип датчика пошагового обнаружения и расширяет события определения местоположения GNSS дополнительными полями точности.
Версия 1.4 (Android 11)
Добавляет поддержку информации о сотах 5G, отладочный дамп nanoapp и другие улучшения.
Обязательные системные функции
Хотя источники контекстных сигналов, такие как датчики, классифицируются по дополнительным функциям, несколько основных функций обязательны для всех реализаций CHRE. Сюда входят основные системные API, такие как API для установки таймеров, отправки и получения сообщений клиентам на процессоре приложений, ведения журналов и другие. Подробную информацию см. в заголовках API .
Помимо основных системных функций, кодифицированных в API CHRE, существуют также обязательные системные функции CHRE, указанные на уровне HAL в Context Hub. Наиболее важной из них является возможность динамической загрузки и выгрузки наноприложений.
Стандартная библиотека C/C++
Чтобы минимизировать использование памяти и сложность системы, реализации CHRE должны поддерживать только подмножество стандартных библиотек C и C++ и языковых функций, требующих поддержки во время выполнения. Следуя этим принципам, некоторые функции явно исключаются из-за их зависимости от памяти и обширных зависимостей на уровне ОС, а другие — потому что они вытесняются более подходящими API, специфичными для CHRE. Хотя список этих возможностей не является исчерпывающим, они не предназначены для использования в nanoapps:
- Исключения 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
Во многих случаях аналогичные возможности доступны в функциях API CHRE и вспомогательных библиотеках. Например, chreLog
можно использовать для отладочного ведения журнала, ориентированного на систему Android logcat, тогда как более традиционная программа могла бы использовать printf
или std::cout
.
Напротив, некоторые возможности стандартной библиотеки обязательны. Реализация платформы может предоставить их через статические библиотеки для включения в двоичный файл nanoapp или посредством динамической компоновки между nanoapp и системой. Это включает в себя, помимо прочего:
- Утилиты для работы со строками и массивами:
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, если оно не ограничивает свои внешние зависимости функциями API CHRE и утвержденными функциями стандартной библиотеки.
Дополнительные функции
Для продвижения аппаратного и программного обеспечения API CHRE разделён на области функций, которые считаются необязательными с точки зрения API. Хотя эти функции могут не быть обязательными для поддержки совместимой реализации CHRE, они могут быть необходимы для поддержки конкретного наноприложения. Даже если платформа не поддерживает заданный набор API, наноприложения, ссылающиеся на эти функции, должны быть способны к сборке и загрузке.
Датчики
API CHRE предоставляет возможность запрашивать данные с датчиков, включая акселерометр, гироскоп, магнитометр, датчик освещенности и датчик приближения. Эти API предоставляют набор функций, аналогичный API датчиков Android, включая поддержку пакетной обработки данных с датчиков для снижения энергопотребления. Обработка данных датчиков в CHRE обеспечивает значительное снижение энергопотребления и уменьшение задержки при обработке сигналов движения по сравнению с работой на точке доступа.
ГНСС
CHRE предоставляет API для запроса данных о местоположении из глобальной навигационной спутниковой системы (ГНСС), включая GPS и другие спутниковые созвездия. Это включает в себя запросы на периодические определения местоположения, а также на необработанные данные измерений, хотя оба эти варианта являются независимыми. Благодаря прямому подключению CHRE к подсистеме ГНСС, энергопотребление снижается по сравнению с запросами ГНСС через точку доступа, поскольку точка доступа может находиться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.
Wi-Fi
CHRE обеспечивает взаимодействие с чипом Wi-Fi, в первую очередь для определения местоположения. Хотя GNSS хорошо работает на открытом воздухе, результаты сканирования Wi-Fi могут предоставлять точную информацию о местоположении в помещениях и в густонаселённых районах. Помимо экономии затрат на активацию точки доступа для сканирования, CHRE может прослушивать результаты сканирования Wi-Fi, выполняемого прошивкой Wi-Fi, для проверки подключения, которые обычно не передаются точке доступа из-за энергозатрат. Использование сканирования подключения для контекстных целей помогает сократить общее количество выполняемых сканирований Wi-Fi, экономя при этом электроэнергию.
Поддержка Wi-Fi была добавлена в API CHRE v1.1, включая возможность мониторинга результатов сканирования и запуска сканирования по запросу. В версии 1.2 эти возможности были расширены за счёт возможности измерения времени прохождения сигнала в обе стороны (RTT) для точек доступа, поддерживающих эту функцию, что позволяет точно определять относительное местоположение.
WWAN
API CHRE предоставляет возможность извлекать идентификационную информацию для обслуживающей соты и ее соседей, которая обычно используется для целей грубого определения местоположения.
Аудио
CHRE может обрабатывать пакеты аудиоданных с маломощного микрофона, который обычно использует аппаратное обеспечение, используемое для реализации SoundTrigger HAL. Обработка аудиоданных в CHRE позволяет объединять их с другими данными, например, с датчиков движения.
Референтная реализация
Справочный код для фреймворка CHRE включен в AOSP в проекте system/chre
, реализованном на C++11. Хотя это не является строго обязательным, рекомендуется, чтобы все реализации CHRE основывались на этой кодовой базе, чтобы обеспечить согласованность и ускорить внедрение новых возможностей. Этот код можно рассматривать как аналог основного фреймворка Android, поскольку он представляет собой реализацию API с открытым исходным кодом, используемую приложениями, служащую основой и стандартом совместимости. Хотя его можно настраивать и расширять с помощью специфичных для вендора возможностей, рекомендуется поддерживать общий код как можно ближе к эталонному. Подобно HAL-областям Android, эталонная реализация CHRE использует различные платформенные абстракции, что позволяет адаптировать ее к любому устройству, отвечающему минимальным требованиям.
Технические подробности и руководство по портированию см. в файле README , включенном в проект system/chre
.