Смартфоны содержат несколько процессоров, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). AP настроен на обеспечение высокой производительности для случаев использования экрана, таких как игры, но он слишком прожорлив для поддержки функций, требующих частых, коротких всплесков обработки все время, даже когда экран выключен. Меньшие процессоры способны обрабатывать эти рабочие нагрузки более эффективно, выполняя свои задачи без заметного влияния на срок службы батареи. Однако программные среды в этих маломощных процессорах более ограничены и могут сильно различаться, что затрудняет кроссплатформенную разработку.
Context Hub Runtime Environment (CHRE) предоставляет общую платформу для запуска приложений на маломощном процессоре с простым, стандартизированным, удобным для встраиваемых систем API. CHRE позволяет OEM-производителям устройств и их доверенным партнерам легко разгружать обработку с AP, экономить заряд батареи и улучшать различные области пользовательского опыта, а также включать класс постоянно включенных контекстно-зависимых функций, особенно тех, которые связаны с применением машинного обучения к зондированию окружающей среды.
Ключевые понятия
CHRE — это программная среда, в которой небольшие собственные приложения, называемые nanoapps , выполняются на маломощном процессоре и взаимодействуют с базовой системой через общий API CHRE. Для ускорения надлежащей реализации API CHRE в AOSP включена кроссплатформенная эталонная реализация CHRE. Эталонная реализация включает общий код и абстракции для базового оборудования и программного обеспечения через ряд уровней абстракции платформы (PAL). Nanoapps почти всегда привязаны к одному или нескольким клиентским приложениям , работающим в Android, которые взаимодействуют с CHRE и nanoapps через системные API ContextHubManager
с ограниченным доступом.
На высоком уровне можно провести параллели между архитектурой CHRE и Android в целом. Однако есть несколько важных различий:
- CHRE поддерживает запуск только наноприложений, разработанных на машинном коде (C или C++); Java не поддерживается.
- Из-за ограничений ресурсов и безопасности CHRE не открыт для использования произвольными сторонними приложениями Android. Доступ к нему могут получить только доверенные системные приложения.
Также следует провести важное различие между концепцией CHRE и концентратора датчиков. Хотя для реализации концентратора датчиков и CHRE обычно используется одно и то же оборудование, сам CHRE не предоставляет возможностей датчиков, требуемых Android Sensors HAL . CHRE привязан к Context Hub HAL и действует как клиент специфичной для устройства сенсорной структуры для получения данных датчиков без участия AP.
Рисунок 1. Архитектура структуры CHRE
Контекстный концентратор HAL
Уровень абстракции оборудования (HAL) Context Hub — это интерфейс между фреймворком Android и реализацией CHRE устройства, определенный в hardware/interfaces/contexthub
. Context Hub HAL определяет API, через которые фреймворк Android обнаруживает доступные контекстные концентраторы и их наноприложения, взаимодействует с этими наноприложениями посредством передачи сообщений и позволяет загружать и выгружать наноприложения. Справочная реализация Context Hub HAL, которая работает с справочной реализацией CHRE, доступна в system/chre/host
.
В случае противоречия между данной документацией и определением HAL приоритет имеет определение HAL.
Инициализация
При загрузке Android ContextHubService вызывает функцию HAL getHubs()
, чтобы определить, доступны ли на устройстве какие-либо контекстные концентраторы. Это блокирующий одноразовый вызов, поэтому он должен завершаться быстро, чтобы избежать задержки загрузки, и он должен возвращать точный результат, поскольку новые контекстные концентраторы не могут быть введены впоследствии.
Загрузка и выгрузка наноприложений
Контекстный концентратор может включать набор nanoapps, которые включены в образ устройства и загружаются при запуске CHRE. Они известны как предварительно загруженные nanoapps и должны быть включены в первый возможный ответ на queryApps()
.
Context Hub HAL также поддерживает динамическую загрузку и выгрузку nanoapps во время выполнения с помощью функций loadNanoApp()
и unloadNanoApp()
. Nanoapps предоставляются HAL в двоичном формате, специфичном для аппаратной и программной реализации CHRE устройства.
Если реализация загрузки nanoapp подразумевает запись его в энергонезависимую память, например, флэш-накопитель, подключенный к процессору, на котором запущен CHRE, то реализация CHRE всегда должна загружаться с этими динамическими nanoapps в отключенном состоянии. Это означает, что никакой код nanoapp не будет выполнен, пока не будет получен запрос enableNanoapp()
через HAL. Предварительно загруженные nanoapps могут инициализироваться во включенном состоянии.
Контекстный хаб перезапускается
Хотя CHRE не должен перезапускаться в ходе нормальной работы, может потребоваться восстановление после непредвиденных условий, таких как попытка доступа к неотображенному адресу памяти. В таких ситуациях CHRE перезапускается независимо от Android. HAL уведомляет Android об этом через событие RESTARTED
, которое он должен отправить только после того, как CHRE будет повторно инициализирован до такой степени, что сможет принимать новые запросы, такие как queryApps()
.
Обзор системы CHRE
CHRE разработан на основе событийно-управляемой архитектуры, где основной единицей вычисления является событие, переданное в точку входа обработки событий nanoapp. Хотя фреймворк CHRE может быть многопоточным, заданное nanoapp никогда не выполняется из нескольких потоков параллельно. Фреймворк CHRE взаимодействует с заданным nanoapp через одну из трех точек входа nanoapp ( nanoappStart()
, nanoappHandleEvent()
и nanoappEnd()
) или через обратный вызов, предоставленный в предыдущем вызове API CHRE, а nanoapps взаимодействуют с фреймворком CHRE и базовой системой через API CHRE. API CHRE предоставляет набор базовых возможностей, а также средства для доступа к контекстным сигналам, включая датчики, GNSS, Wi-Fi, WWAN и аудио, и его можно расширить с помощью дополнительных возможностей, специфичных для поставщика, для использования nanoapps, специфичных для поставщика.
Система сборки
В то время как Context Hub HAL и другие необходимые компоненты AP-side строятся вместе с Android, код, который работает в CHRE, может иметь требования, которые делают его несовместимым с системой сборки Android, например, необходимость в специализированной цепочке инструментов. Поэтому проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции nanoapps и, опционально, фреймворк CHRE в библиотеки, которые могут быть интегрированы с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
API CHRE написан на стандарте языка C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.
API-интерфейс CHRE
API CHRE — это набор файлов заголовков C, которые определяют программный интерфейс между nanoapp и системой. Он разработан для того, чтобы сделать код nanoapps совместимым на всех устройствах, которые поддерживают CHRE, что означает, что исходный код nanoapp не нужно изменять для поддержки нового типа устройства, хотя его может потребоваться перекомпилировать специально для набора инструкций процессора целевого устройства или двоичного интерфейса приложения (ABI). Архитектура CHRE и дизайн API также гарантируют, что nanoapps являются двоичными в разных версиях 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)
Включает поддержку датчиков и основных возможностей наноприложений, таких как события и таймеры.
Версия 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 CHRE, существуют также обязательные системные функции CHRE, указанные на уровне HAL Context Hub. Наиболее значимой из них является возможность динамической загрузки и выгрузки nanoapps.
Стандартная библиотека 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
Во многих случаях эквивалентные возможности доступны из функций 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, они могут потребоваться для поддержки конкретного nanoapp. Даже если платформа не поддерживает заданный набор API, nanoapps, ссылающиеся на эти функции, должны иметь возможность сборки и загрузки.
Датчики
API CHRE обеспечивает возможность запрашивать данные с датчиков, включая акселерометр, гироскоп, магнитометр, датчик внешней освещенности и датчик приближения. Эти API предназначены для предоставления набора функций, аналогичного API датчиков Android, включая поддержку пакетной обработки образцов датчиков для снижения энергопотребления. Обработка данных датчиков в CHRE обеспечивает гораздо более низкую мощность и меньшую задержку обработки сигналов движения по сравнению с работой на AP.
ГНСС
CHRE предоставляет API для запроса данных о местоположении из глобальной навигационной спутниковой системы (GNSS), включая GPS и другие спутниковые созвездия. Это включает запросы на периодические определения местоположения, а также необработанные данные измерений, хотя оба являются независимыми возможностями. Поскольку CHRE имеет прямую связь с подсистемой GNSS, мощность снижается по сравнению с запросами GNSS на основе AP, поскольку AP может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.
Wi-Fi
CHRE обеспечивает возможность взаимодействия с чипом Wi-Fi, в первую очередь для определения местоположения. В то время как GNSS хорошо работает для наружных локаций, результаты сканирования Wi-Fi могут предоставить точную информацию о местоположении в помещениях и в развитых районах. Помимо избежания затрат на пробуждение точки доступа для сканирования, CHRE может прослушивать результаты сканирования Wi-Fi, выполняемого прошивкой Wi-Fi для целей подключения, которые обычно не доставляются точке доступа из-за проблем с питанием. Использование сканирования подключения для контекстных целей помогает сократить общее количество выполненных сканирований Wi-Fi, экономя электроэнергию.
Поддержка Wi-Fi была добавлена в CHRE API v1.1, включая возможность мониторинга результатов сканирования и запуска сканирования по требованию. Эти возможности были расширены в v1.2 возможностью выполнять измерения времени приема-передачи (RTT) для точек доступа, которые поддерживают эту функцию, что позволяет точно определять относительное положение.
WWAN
API CHRE предоставляет возможность извлекать идентификационную информацию для обслуживающей ячейки и ее соседей, которая обычно используется для целей грубого определения местоположения.
Аудио
CHRE может обрабатывать пакеты аудиоданных с маломощного микрофона, который обычно использует аппаратное обеспечение, используемое для реализации SoundTrigger HAL. Обработка аудиоданных в CHRE может позволить объединить их с другими данными, такими как датчики движения.
Референтная реализация
Справочный код для фреймворка CHRE включен в AOSP в проекте system/chre
, реализованном на C++11. Хотя это не является строго обязательным, рекомендуется, чтобы все реализации CHRE основывались на этой кодовой базе, чтобы обеспечить согласованность и ускорить принятие новых возможностей. Этот код можно рассматривать как аналог основного фреймворка Android, поскольку он представляет собой реализацию API с открытым исходным кодом, используемую приложениями, выступающую в качестве базовой линии и стандарта для совместимости. Хотя его можно настраивать и расширять с помощью возможностей, специфичных для поставщика, рекомендуется поддерживать общий код как можно ближе к эталонному. Подобно HAL Android, справочная реализация CHRE использует различные абстракции платформы, чтобы ее можно было адаптировать к любому устройству, отвечающему минимальным требованиям.
Технические подробности и руководство по портированию см. в файле README , включенном в проект system/chre
.