Смартфоны содержат несколько процессоров, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). AP настроен на обеспечение высокой производительности в сценариях использования с включенным экраном, таких как игры, но он слишком энергозатратен для поддержки функций, требующих частых, коротких всплесков обработки постоянно, даже когда экран выключен. Более компактные процессоры способны более эффективно справляться с такими нагрузками, выполняя свои задачи без заметного влияния на время автономной работы. Однако программные среды в этих маломощных процессорах более ограничены и могут сильно различаться, что затрудняет кроссплатформенную разработку.
Context Hub Runtime Environment (CHRE) предоставляет общую платформу для запуска приложений на маломощном процессоре с простым, стандартизированным и удобным для встраиваемых систем API. CHRE упрощает для производителей устройств и их доверенных партнеров разгрузку вычислительных ресурсов с точки доступа, экономию заряда батареи и улучшение различных аспектов пользовательского опыта, а также позволяет реализовать класс постоянно работающих, контекстно-ориентированных функций, особенно тех, которые включают применение машинного обучения к датчикам окружающей среды.
Ключевые понятия
CHRE — это программная среда, в которой небольшие нативные приложения, называемые наноприложениями , выполняются на маломощном процессоре и взаимодействуют с базовой системой через общий API CHRE. Для ускорения корректной реализации API CHRE в AOSP включена кроссплатформенная эталонная реализация CHRE. Эта эталонная реализация включает общий код и абстракции от базового оборудования и программного обеспечения через ряд уровней абстракции платформы (PAL). Наноприложения почти всегда привязаны к одному или нескольким клиентским приложениям, работающим в Android, которые взаимодействуют с CHRE и наноприложениями через API системы ContextHubManager с ограниченным доступом.
В общих чертах можно провести параллели между архитектурой CHRE и Android в целом. Однако есть несколько важных различий:
- CHRE поддерживает запуск только наноприложений, разработанных на нативном коде (C или C++); Java не поддерживается.
- Из-за ограниченности ресурсов и проблем с безопасностью CHRE недоступен для использования произвольными сторонними приложениями Android. Доступ к нему имеют только приложения, которым система доверяет.
Важно также различать концепцию CHRE и концентратора датчиков. Хотя для реализации концентратора датчиков и CHRE обычно используется одно и то же оборудование, сам CHRE не предоставляет возможности датчиков, необходимые для Android Sensors HAL . CHRE связан с Context Hub HAL и выступает в качестве клиента специфичной для устройства платформы датчиков, получая данные с датчиков без участия точки доступа.

Рисунок 1. Архитектура фреймворка CHRE.
Контекстный центр HAL
Уровень аппаратной абстракции Context Hub (HAL) — это интерфейс между фреймворком Android и реализацией CHRE на устройстве, описанный в файле hardware/interfaces/contexthub . Context Hub HAL определяет API, с помощью которых фреймворк Android обнаруживает доступные контекстные хабы и их наноприложения, взаимодействует с этими наноприложениями посредством передачи сообщений и позволяет загружать и выгружать наноприложения. Эталонная реализация Context Hub HAL, работающая с эталонной реализацией CHRE, доступна в файле system/chre/host .
В случае противоречия между данной документацией и определением HAL, приоритет имеет определение HAL.
Инициализация
При загрузке Android служба ContextHubService вызывает функцию HAL getHubs() , чтобы определить, доступны ли на устройстве какие-либо контекстные хабы. Это блокирующий, одноразовый вызов, поэтому он должен завершиться быстро, чтобы избежать задержки загрузки, и должен возвращать точный результат, поскольку новые контекстные хабы не могут быть добавлены после этого.
Загрузка и выгрузка наноприложений
Контекстный центр может включать набор наноприложений, которые входят в состав образа устройства и загружаются при запуске CHRE. Эти наноприложения называются предварительно загруженными и должны быть включены в первый возможный ответ на queryApps() .
HAL Context Hub также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью функций loadNanoApp() и unloadNanoApp() . Наноприложения предоставляются HAL в бинарном формате, специфичном для аппаратной и программной реализации CHRE устройства.
Если реализация загрузки наноприложения включает запись его в энергонезависимую память, например, во флэш-память, подключенную к процессору, на котором работает CHRE, то реализация CHRE всегда должна загружаться с этими динамическими наноприложениями в отключенном состоянии. Это означает, что никакой код наноприложения не выполняется до тех пор, пока через HAL не будет получен запрос enableNanoapp() . Предварительно загруженные наноприложения могут инициализироваться в включенном состоянии.
Перезапуск контекстного центра
Хотя перезапуск CHRE в процессе нормальной работы не ожидается, он может потребоваться для восстановления после непредвиденных ситуаций, таких как попытка доступа к неотображенному адресу памяти. В таких ситуациях CHRE перезапускается независимо от Android. HAL уведомляет об этом Android через событие RESTARTED , которое он должен отправить только после того, как CHRE будет повторно инициализирован до такой степени, что сможет принимать новые запросы, такие как queryApps() .
Обзор системы CHRE
CHRE построен на основе событийно-ориентированной архитектуры, где основной единицей вычислений является событие, передаваемое в точку входа обработки событий наноприложения. Хотя фреймворк CHRE может быть многопоточным, данное наноприложение никогда не выполняется из нескольких потоков параллельно. Фреймворк CHRE взаимодействует с данным наноприложением через одну из трех точек входа наноприложения ( nanoappStart() , nanoappHandleEvent() и nanoappEnd() ) или через обратный вызов, предоставленный в предыдущем вызове API CHRE, а наноприложения взаимодействуют с фреймворком CHRE и базовой системой через API CHRE. API CHRE предоставляет набор базовых возможностей, а также средства для доступа к контекстным сигналам, включая датчики, GNSS, Wi-Fi, WWAN и аудио, и может быть расширен дополнительными возможностями, специфичными для конкретного поставщика, для использования наноприложениями, специфичными для конкретного поставщика.
Система сборки
Хотя Context Hub HAL и другие необходимые компоненты на стороне AP собираются вместе с Android, код, работающий в CHRE, может иметь требования, делающие его несовместимым с системой сборки Android, например, необходимость в специализированном наборе инструментов. Поэтому проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции nanoapps и, при необходимости, фреймворка CHRE в библиотеки, которые могут быть интегрированы с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
API CHRE написан на языке C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.
API CHRE
API CHRE представляет собой набор заголовочных файлов на языке C, определяющих программный интерфейс между наноприложением и системой. Он разработан для обеспечения совместимости кода наноприложений со всеми устройствами, поддерживающими CHRE, что означает, что исходный код наноприложения не нужно модифицировать для поддержки нового типа устройства, хотя его может потребоваться перекомпилировать специально для набора инструкций процессора целевого устройства или интерфейса двоичного кода приложения (ABI). Архитектура CHRE и дизайн API также гарантируют бинарную совместимость наноприложений с различными версиями API CHRE, что означает, что наноприложение не нужно перекомпилировать для работы в системе, реализующей другую версию API CHRE по сравнению с целевым API, для которого скомпилировано наноприложение. Другими словами, если двоичный файл наноприложения работает на устройстве, поддерживающем API CHRE версии 1.3, и это устройство обновляется до поддержки API CHRE версии 1.4, тот же двоичный файл наноприложения продолжает функционировать. Аналогичным образом, наноприложение может работать на CHRE API версии 1.2 и определять во время выполнения, требуются ли ему возможности API версии 1.3 для его использования, или же оно может работать, возможно, с плавным снижением функциональности.
Новые версии API CHRE выпускаются одновременно с Android, однако, поскольку реализация CHRE является частью реализации производителя , поддерживаемая на устройстве версия API CHRE не обязательно связана с версией Android.
Сводка по версиям
Подобно схеме версионирования Android HIDL , API CHRE использует семантическое версионирование . Основная версия указывает на бинарную совместимость, а дополнительная версия увеличивается при добавлении обратно совместимых функций. API CHRE включает аннотации исходного кода для идентификации версии, в которой была введена функция или параметр, например @since v1.1 .
В реализации CHRE также предоставляется версия исправления, специфичная для платформы, через chreGetVersion() , которая указывает на наличие исправлений ошибок или незначительных обновлений в реализации.
Сводную информацию по каждой версии см. в version.h .
Обязательные системные функции
Хотя источники контекстных сигналов, такие как датчики, относятся к необязательным областям функций, некоторые основные функции необходимы во всех реализациях CHRE. Это включает в себя основные системные API, такие как API для установки таймеров, отправки и получения сообщений клиентам на процессоре приложений, ведения журналов и другие. Для получения полной информации см. заголовки API .
В дополнение к основным системным функциям, кодифицированным в API CHRE, существуют также обязательные системные функции CHRE, указанные на уровне HAL Context Hub. Наиболее значимой из них является возможность динамической загрузки и выгрузки nanoapps.
Стандартная библиотека 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 можно использовать для отладочного логирования, предназначенного для системы logcat Android, тогда как более традиционная программа могла бы использовать 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 обеспечивает значительно меньшее энергопотребление и меньшую задержку при обработке сигналов движения по сравнению с работой непосредственно на точке доступа.
GNSS
CHRE предоставляет API для запроса данных о местоположении от глобальной навигационной спутниковой системы (GNSS), включая GPS и другие спутниковые группировки. Это включает запросы на периодическое определение местоположения, а также необработанные данные измерений, хотя обе возможности являются независимыми. Поскольку CHRE имеет прямую связь с подсистемой GNSS, энергопотребление снижается по сравнению с запросами GNSS через точку доступа, так как точка доступа может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.
Wi-Fi
CHRE обеспечивает возможность взаимодействия с Wi-Fi-чипом, в первую очередь, для определения местоположения. Хотя GNSS хорошо работает на открытом воздухе, результаты сканирования Wi-Fi могут предоставлять точную информацию о местоположении в помещениях и на застроенных территориях. Помимо экономии средств на пробуждение точки доступа для сканирования, CHRE может отслеживать результаты сканирования Wi-Fi, выполняемого встроенным модулем Wi-Fi, для целей обеспечения связи, которые обычно не передаются на точку доступа по соображениям энергопотребления. Использование результатов сканирования для контекстных целей помогает сократить общее количество выполняемых сканирований Wi-Fi, экономя энергию.
В версии CHRE API v1.1 была добавлена поддержка Wi-Fi, включая возможность мониторинга результатов сканирования и запуска сканирования по запросу. В версии 1.2 эти возможности были расширены за счет возможности измерения времени кругового пути (RTT) для точек доступа, поддерживающих эту функцию, что позволяет точно определять относительное положение.
WWAN
API CHRE предоставляет возможность получать идентификационную информацию для обслуживающей соты и ее соседей, которая обычно используется для определения местоположения с высокой степенью детализации.
Аудио
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 .