Среда выполнения контекстного концентратора (CHRE)

Смартфоны содержат несколько процессоров, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). Точка доступа настроена на обеспечение высокой производительности в случаях использования с включенным экраном, например в играх, но она слишком энергоемка для поддержки функций, которые постоянно требуют частых коротких всплесков обработки, даже когда экран выключен. Меньшие процессоры способны более эффективно справляться с этими рабочими нагрузками, выполняя свои задачи без заметного влияния на срок службы батареи. Однако программная среда в этих процессорах с низким энергопотреблением более ограничена и может сильно различаться, что затрудняет кроссплатформенную разработку.

Среда выполнения Context Hub (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 привязан к HAL Context Hub и действует как клиент системы датчиков для конкретного устройства, получая данные датчиков без участия точки доступа.

Архитектура платформы CHRE

Рисунок 1. Архитектура платформы CHRE

Контекстный хаб HAL

Уровень аппаратной абстракции Context Hub (HAL) — это интерфейс между платформой 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() .

Context Hub HAL также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью функций loadNanoApp() и unloadNanoApp() . Наноприложения предоставляются HAL в двоичном формате, специфичном для аппаратной и программной реализации устройства CHRE.

Если реализация загрузки наноприложения предполагает его запись в энергонезависимую память, например, во флэш-память, подключенную к процессору, на котором работает CHRE, то реализация CHRE всегда должна загружаться с этими динамическими наноприложениями в отключенном состоянии. Это означает, что ни один код nanoapp не выполняется до тех пор, пока через 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 и аудио, и его можно расширить за счет дополнительных возможностей, специфичных для конкретного поставщика, для использования наноприложениями, зависящими от конкретного поставщика. .

Система сборки

Хотя HAL Context Hub и другие необходимые компоненты на стороне точки доступа создаются вместе с Android, код, работающий в CHRE, может иметь требования, которые делают его несовместимым с системой сборки Android, например необходимость в специализированной цепочке инструментов. Таким образом, проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции наноприложений и, при необходимости, инфраструктуру CHRE в библиотеки, которые можно интегрировать с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.

API CHRE написан в соответствии со стандартом языка C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.

ЧРЕ API

CHRE API — это набор заголовочных файлов C, которые определяют программный интерфейс между nanoapp и системой. Он предназначен для обеспечения совместимости кода наноприложений на всех устройствах, поддерживающих CHRE. Это означает, что исходный код наноприложения не нужно изменять для поддержки нового типа устройства, хотя, возможно, его придется перекомпилировать специально для процессора целевого устройства. набор команд или двоичный интерфейс приложения (ABI). Архитектура CHRE и дизайн API также гарантируют двоичную совместимость наноприложений с различными версиями CHRE API. Это означает, что наноприложение не нужно перекомпилировать для запуска в системе, которая реализует другую версию CHRE API по сравнению с предыдущей. целевой API, с которым компилируется nanoapp. Другими словами, если двоичный файл nanoapp запускается на устройстве, поддерживающем CHRE API v1.3, и это устройство обновляется для поддержки CHRE API v1.4, тот же двоичный файл nanoapp продолжает работать. Аналогичным образом, наноприложение может работать на CHRE API v1.2 и во время выполнения может определять, требуются ли ему возможности API v1.3 для его использования или оно может работать, потенциально с плавным ухудшением функций.

Новые версии CHRE API выпускаются вместе с Android, однако, поскольку реализация CHRE является частью реализации поставщика , версия CHRE API, поддерживаемая на устройстве, не обязательно связана с версией Android.

Сводка версий

Как и схема управления версиями Android HIDL , API CHRE использует семантическое управление версиями . Основная версия указывает на двоичную совместимость, а дополнительная версия увеличивается при появлении функций обратной совместимости. CHRE API включает аннотации исходного кода, позволяющие определить, в какой версии появилась функция или параметр, например @since v1.1 .

Реализация CHRE также предоставляет версию исправления для конкретной платформы через chreGetVersion() , которая указывает, когда в реализации вносятся исправления ошибок или незначительные обновления.

Версия 1.0 (Андроид 7)

Включает поддержку датчиков и основных возможностей nanoapp, таких как события и таймеры.

Версия 1.1 (Андроид 8)

Представляет возможности определения местоположения посредством определения местоположения GNSS и необработанных измерений, сканирования Wi-Fi и информации о мобильной сети, а также общие усовершенствования для обеспечения связи между наноприложениями и другие улучшения.

Версия 1.2 (Андроид 9)

Добавлена ​​поддержка данных от маломощного микрофона, диапазон Wi-Fi RTT, уведомления о пробуждении и сне точки доступа и другие улучшения.

Версия 1.3 (Андроид 10)

Расширяет возможности, связанные с данными калибровки датчиков, добавляет поддержку очистки пакетных данных датчиков по требованию, определяет тип датчика обнаружения шага и расширяет события определения местоположения GNSS с помощью дополнительных полей точности.

Версия 1.4 (Андроид 11)

Добавлена ​​поддержка информации о сотах 5G, дамп отладки nanoapp и другие улучшения.

Обязательные функции системы

Хотя источники контекстных сигналов, такие как датчики, классифицируются по дополнительным функциональным областям, во всех реализациях CHRE требуется несколько основных функций. Сюда входят API-интерфейсы базовой системы, например, для настройки таймеров, отправки и получения сообщений клиентам на процессоре приложений, ведения журналов и т. д. Полную информацию смотрите в заголовках API .

В дополнение к основным функциям системы, кодифицированным в API CHRE, существуют также обязательные функции системного уровня 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
  • Поддержка локализации и символов Юникода.
  • Библиотеки даты и времени
  • Функции, которые изменяют обычный ход программы, включая <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 для запроса данных о местоположении из глобальной навигационной спутниковой системы (GNSS), включая GPS и другие группировки спутников. Сюда входят запросы на периодическую фиксацию положения, а также необработанные данные измерений, хотя обе возможности являются независимыми. Поскольку CHRE имеет прямую связь с подсистемой GNSS, мощность снижается по сравнению с запросами GNSS на основе точки доступа, поскольку точка доступа может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.

Wi-Fi

CHRE обеспечивает возможность взаимодействия с чипом Wi-Fi, в первую очередь для определения местоположения. Хотя GNSS хорошо работает на открытом воздухе, результаты сканирования Wi-Fi могут предоставить точную информацию о местоположении внутри помещений и в развитых районах. Помимо того, что CHRE позволяет избежать затрат на пробуждение точки доступа для сканирования, она может прослушивать результаты сканирования Wi-Fi, выполняемого прошивкой Wi-Fi, для целей подключения, которые обычно не доставляются на точку доступа по причинам, связанным с питанием. Использование сканирования подключений для контекстуальных целей помогает сократить общее количество выполняемых сканирований Wi-Fi, экономя электроэнергию.

Поддержка Wi-Fi была добавлена ​​в CHRE API 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 .